首先创建DocumentBuilderFactory工厂产生DocumentBuilder对象
DocumentBuilderFactory documentBuildFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder=documentBuildFactory.newDocumentBuilder();
创建document对象:
使用documentBuilder对象的parse方法
Document document=documentBuilder.parse(new File("bin/newxml.xml"));
如果这个时候我们直接输出document.toString()得到的只是一个null值。我们需要进一步的解析
不知道怎么讲了,将全部代码贴在这里吧!
document.getDocumentElement()。获取document下的子元素也就是根元素。
然后是用root.getElementsByTagName()获取根的子元素的Nodelist集合。
注意在子元素全部同级的时候使用element.getChildNodes()比.getElementsByTagName()更省略代码
得到的解析节点会自己解析空格作为一个节点,后面可以使用if语句过滤掉。
package com.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ReadXml { public static void main(String[] args){ try { DocumentBuilderFactory documentBuildFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder=documentBuildFactory.newDocumentBuilder(); Document document=documentBuilder.parse(new File("bin/newxml.xml")); //System.out.println(document.toString());这样直接输出的到的是null,没有解析 Element root=document.getDocumentElement();//获取根对象 System.out.println(root.getTagName()+" cat="+root.getAttribute("cat")); NodeList lan= root.getElementsByTagName("lan"); for(int j=0;j<lan.getLength();j++){ System.out.println("---------------------"); Element list=(Element) lan.item(j); System.out.println(list.getNodeName()+" id="+list.getAttribute("id")); /*Element name=(Element) list.getElementsByTagName("name").item(0); System.out.println("name="+name.getTextContent()); Element ide=(Element) list.getElementsByTagName("ide").item(0); System.out.println("ide="+ide.getTextContent());*/ NodeList clist=list.getChildNodes(); for(int i=0;i<clist.getLength();i++){ Node c= clist.item(i); if(c instanceof Element){ System.out.println(c.getNodeName()+"="+c.getTextContent()); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这是我写的遍历node集合的代码:
注意:文本内容也是一个节点。不仅仅是在标签外的空格算节点,标签的内容也是节点。
public static void iteratorNode(Node node){ if(node instanceof Element||node instanceof Document){ NamedNodeMap attributeList=node.getAttributes(); NodeList list=node.getChildNodes(); System.out.println("list:"+list.getLength()); System.out.print(node.getNodeName()+" "); if(attributeList!=null&&attributeList.getLength()>0){ for(int i=0;i<attributeList.getLength();i++){ Node nodetemp=attributeList.item(i); /* System.out.println(1);*/ System.out.print(nodetemp.getNodeName()+"=\""+nodetemp.getNodeValue()+"\" "); } } if(list.getLength()<=1&&!(node instanceof Document)){ /* 注意文本也是一个节点 */ System.out.println("value="+node.getTextContent()); } else { System.out.println(); for(int i=0;i<list.getLength();i++){ iteratorNode(list.item(i)); } } } }