DOM方式解析XML

元素VS节点

节点包括:元素节点、属性节点、文本节点。元素一定是节点,但是节点不一定是元素。

1 <?xml version="1.0" encoding="UTF-8"?>
2 <student>
3     <name id="001">张三</name>
4     <sex></sex>
5     <age>20</age>
6 </student>

文本节点:张三 男  20

元素节点:student  name  sex  age

属性节点id="001"

DOM方式解析XML原理

基于DOM(Document Object Model,文档对象模型)解析方式,是把整个XML文档加载到内存,转化成DOM树,因此应用程序可以随机的访问DOM树的任何数据;

优点:灵活性强,速度快;

缺点:消耗资源比较多;

DOM方式解析XML示例

1 <?xml version="1.0" encoding="UTF-8"?>
2 <student>
3     <name id="001">张三</name>
4     <sex></sex>
5     <age>20</age>
6 </student>

java文件:

 1 package com.java1234.xml;
 2 import javax.xml.parsers.DocumentBuilder;
 3 import javax.xml.parsers.DocumentBuilderFactory;
 4 import org.w3c.dom.Document;
 5 import org.w3c.dom.Element;
 6 import org.w3c.dom.NodeList;
 7 
 8 public class DOM01 {
 9     public static void main(String[] args) {
10         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//利用DocumentBuilderFactory.newInstance();
11         try {
12             DocumentBuilder builder=factory.newDocumentBuilder();//利用Builder
13             Document doc=builder.parse("src/demo01.xml");//读取文件
14             NodeList nodelist=doc.getElementsByTagName("student");//寻找节点
15             Element e=(Element)nodelist.item(0);
16             System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());//解析节点
17             System.out.println("年龄:"+e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());//解析年龄
18             System.out.println("性别:"+e.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue());//解析性别
19         } catch (Exception e) {
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         }
23     }
24 }

这样可以把信息顺利的解析出来。

再来看一下复杂一些的例子:

多个信息:

students.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <students>
 3     <student>
 4         <name id="001">张三</name>
 5         <sex></sex>
 6         <age>20</age>
 7     </student>
 8     <student>
 9         <name xx="002">李四</name>
10         <sex></sex>
11         <age>18</age>
12     </student>
13 </students>

解析:

 1 package com.java1234.xml;
 2 
 3 import javax.xml.parsers.DocumentBuilder;
 4 import javax.xml.parsers.DocumentBuilderFactory;
 5 import javax.xml.parsers.ParserConfigurationException;
 6 import org.w3c.dom.Document;
 7 import org.w3c.dom.Element;
 8 import org.w3c.dom.NamedNodeMap;
 9 import org.w3c.dom.Node;
10 import org.w3c.dom.NodeList;
11 
12 import com.sun.tracing.dtrace.NameAttributes;
13 
14 public class Demo02 {
//识别属性的方法!
15 public static void printNode(Node node){ 16 NamedNodeMap nodemap=node.getAttributes(); 17 for(int i=0;i<nodemap.getLength();i++){ 18 Node e=nodemap.item(i); 19 System.out.println(e.getNodeName()+" : "+e.getFirstChild().getNodeValue()); 20 } 21 22 } 23 public static void main(String[] args) { 24 DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); 25 try { 26 DocumentBuilder builder= factory.newDocumentBuilder(); 27 Document doc=builder.parse("src/students.xml"); 28 NodeList nodelist=doc.getElementsByTagName("students"); 29 Element element=(Element)nodelist.item(0); 30 NodeList nodelists =element.getElementsByTagName("student"); 31 for(int i=0;i<nodelists.getLength();i++){ 32 Element e=(Element)nodelists.item(i); 33 System.out.println("姓名: "+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); 34 printNode(e.getElementsByTagName("name").item(0)); 35 System.out.println("年龄: "+e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue()); 36 System.out.println("性别: "+e.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue()); 37 System.out.println("==============================================="); 38 } 39 } catch (Exception e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } 43 44 } 45 }

OK了!

原文地址:https://www.cnblogs.com/zyxsblogs/p/10108616.html