W3CSCHOOL给了咱们很好的解释。java
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。数据库
XML 数据以纯文本格式进行存储,所以提供了一种独立于软件和硬件的数据存储方法。浏览器
这让建立不一样应用程序能够共享的数据变得更加容易。dom
经过 XML,能够在不兼容的系统之间轻松地交换数据。ide
对开发人员来讲,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。ui
因为能够经过各类不兼容的应用程序来读取数据,以 XML 交换数据下降了这种复杂性。spa
升级到新的系统(硬件或软件平台),老是很是费时的。必须转换大量的数据,不兼容的数据常常会丢失。操作系统
XML 数据以文本格式存储。这使得 XML 在不损失数据的状况下,更容易扩展或升级到新的操做系统、新应用程序或新的浏览器。3d
因为 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。code
不一样的应用程序都可以访问您的数据,不单单在 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 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(),固然这个是
得到第一个子节点仍是最后一个子节点是由本身定的了。