元素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了!