DOM使用简单,但只适合于一些小的Xml文档,因为Dom解析Xml文档时,要将其读入内存,生成DOM树。
具体操作方法如下
要解析的XML文档
<persons>
<person id="1001">
<name><![CDATA[<>上上</>]]></name> <!-- <![CDATA[<>上上</>]]> 预定义字符3.
-->
<sex>男</sex>
<mobile>123456</mobile>
<address>
<country>中国</country>
<province>湖南</province>
<city>衡阳</city>
</address>
</person>
<person id="1002">
<name>tom</name>
<sex>女</sex>
<mobile>654321</mobile>
<address>
<country>美国</country>
<province>纽约</province>
<city>不知道</city>
</address>
</person>
</persons>
DOM解析
package com.yc.xml.study01; import java.io.FileInputStream; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class DOMParseDemo01{ public static void main(String[] args) throws Exception { DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//文档构建工厂对象 DocumentBuilder builder=factory.newDocumentBuilder();// InputStream in=new FileInputStream("study/study01.xml");//读取xml文件数据流 Document doc=builder.parse(in);//加载xml文件数据流,通过文档构建对象,构建出树状结构的文档对象 Node headNode=doc.getDocumentElement();//取到根节点 listAllChildNodes(headNode, 0); } private static void listAllChildNodes(Node node, int level) { // TODO Auto-generated method stub if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println("+++++++++++++++++"+node.getNodeName()+"+++++++++++++++"+node.getFirstChild().getNodeValue());//打印出元素名,元素值 if (node.hasAttributes()) { //判断该节点是否有属性 NamedNodeMap nnmap = node.getAttributes(); //获取属性 for (int i = 0; i < nnmap.getLength(); i++) { System.out.println(nnmap.item(i).getNodeName() + nnmap.item(i).getNodeValue());//打印出属性名,属性值 } } if(node.hasChildNodes()){//如果这个节点有子节点 NodeList nodelist = node.getChildNodes(); //取到所有子节点并存到一个数组里,NodeList可以看成一个数组 level++; for (int i = 0; i < nodelist.getLength(); i++) { if (nodelist.item(i).getNodeType() == Node.ELEMENT_NODE) {//判断这个节点是否是有效的节点 // 递归调用方法 - 以遍历该节点下面所有的子节点 listAllChildNodes(nodelist.item(i), level);// level表示该节点处于第几个层次(相应空格) } } level--; } } } }
运行结果: