为什么要解析XML文档?
W3CSCHOOL给了我们很好的解释。
XML 简化数据共享
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。
XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
这让创建不同应用程序可以共享的数据变得更加容易。
XML 简化数据传输
通过 XML,可以在不兼容的系统之间轻松地交换数据。
对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。
由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。
XML 简化平台的变更
升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。
XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。
XML 使您的数据更有用
由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。
不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。
通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。
假如开发人员都是理性的
假如他们都是理性的,就让未来的应用程序使用 XML 来交换数据吧。
未来也许会出现某种字处理软件、电子表格程序以及数据库,它们可以使用纯文本格式读取彼此的数据,而不需要使用任何的转换程序。
我们现在能做的只有祈祷微软公司和所有其他的软件开发商在这一方面取得一致了。
摘自:http://www.w3school.com.cn/xml/xml_usedfor.asp
XML是树形结构,用DOM方法来解析是很轻易的事情。下面来看一看用DOM怎么解析XML文档。
采用了一个简单的例子来说明一下,有意愿的可以再改进添加代码。
1. 从xml获得生成DOM对象树的解析器
//创建DocumentBuliderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2. 获得Doucument的生成器,可以利用解析器的newDocumentBuilder()获得示例
//创建DocumentBulider对象
DocumentBuilder db = dbf.newDocumentBuilder();
3. 用DocumentBuilder的parse()解析xml文件获得Doucment对象。
//创建Document对象
Document document=db.parse("book.xml");
4. 获得当前节点的子节点
//创建NodeList对象接收xml文件中的book节点
NodeList booklist=document.getElementsByTagName("book");
5. 获得子节点的属性和子节点
//获取属性
NamedNodeMap nnM = booklist.item(i).getAttributes();
//获取子节点
NodeList bookChildNodes=booklist.item(i).getChildNodes();
下面是我写的一个小实例,比较简陋,根据已有的XML文档进行简单解析。
XML文档:
<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
<book id="1">
<name>111</name>
<author>222</author>
</book>
<book id="2">
<name>333</name>
<author>444</author>
</book>
</bookstore>
树形结构如下:
具体实现如下:
1 package com.lpp.domxml.test1;
2
3 import java.io.IOException;
4
5 import javax.xml.parsers.DocumentBuilder;
6 import javax.xml.parsers.DocumentBuilderFactory;
7 import javax.xml.parsers.ParserConfigurationException;
8 import javax.xml.soap.Node;
9
10 import org.w3c.dom.Document;
11 import org.w3c.dom.NamedNodeMap;
12 import org.w3c.dom.NodeList;
13 import org.xml.sax.SAXException;
14
15 public class dom
16 {
17
18 public static void main(String[] args)
19 {
20 // TODO Auto-generated method stub
21 //创建DocumentBuliderFactory对象
22 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
23
24 try
25 {
26 //创建DocumentBulider对象
27 DocumentBuilder db = dbf.newDocumentBuilder();
28 //创建Document对象
29 Document document=db.parse("book.xml");
30 //创建NodeList对象接收xml文件中的book节点
31 NodeList booklist=document.getElementsByTagName("book");
32
33 for(int i=0;i<booklist.getLength();i++)
34 {
35 //遍历booklist将book节点属性存储到NameNodeMap类型的nnM变量中
36 NamedNodeMap nnM = booklist.item(i).getAttributes();
37
38 System.out.println("第"+(i+1)+"本书");
39 for(int j=0;j<nnM.getLength();j++)
40 {
41 //遍历nnM变量输出所有属性名称和属性值
42 System.out.println(
43 nnM.item(j).getNodeName()
44 +"的属性值"+nnM.item(j).getNodeValue());
45 }
46
47 NodeList bookChildNodes=booklist.item(i).getChildNodes();
48 int bookChildNodeNumber=bookChildNodes.getLength();
49 int t=1;
50 for(int k=0;k<bookChildNodeNumber;k++)
51 {
52 //遍历bookChildNodeNumber变量输出所有子节点名称和属性值
53 if (bookChildNodes.item(k).getNodeType() == Node.ELEMENT_NODE)
54 {
55 System.out.println(" 第" + t + "个子节点" + bookChildNodes.item(k).getNodeName()
56 +"的节点值"+bookChildNodes.item(k).getTextContent());
57 //bookChildNodes.item(k).getFirstChildNodes().getNodeValue();
58 t++;
59 }
60 }
61 }
62 }
63 catch (ParserConfigurationException e)
64 {
65 // TODO Auto-generated catch block
66 e.printStackTrace();
67 }
68
69 catch (SAXException | IOException e)
70 {
71 // TODO Auto-generated catch block
72 e.printStackTrace();
73 }
74 }
75
76 }
结果:
注意:
在xml文档中不仅仅只有上面树形结构图上面的节点,在每两个节点之间还有个特殊的text节点,你用getNodeName()方法获得的节点名称为#text,
节点值为空。所以,我们用if语句判断一下该节点是否为Element,bookChildNodes.item(k).getNodeType() == Node.ELEMENT_NODE,这条语句判断
是否为element类型的节点。
获取节点的文本值的时候,直接用getNodeValue()是不行的。需要用getTextContent(),或者是getFirstChildNodes().getNodeValue(),当然这个是
获得第一个子节点还是最后一个子节点是由自己定的了。