本文介绍xml.
什么是 XML?
XML指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML 与 HTML 的主要差异
XML 不是 HTML 的替代。
###XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
XML是一种通用的数据交换格式,它与平台、语言、系统无关,给数据集成与交互带来了极大的方便。对XML本身的语法与技术细节,可以参阅w3c官方网站 上相关的技术文献,包括:DOM(Document Object Model)、DTD(Document Type Definition)、SAX(Simple API for XML)、XSD(Xml Schema Definition)、XSLT(Extensible Stylesheet Language Transformation)。
XML 文档形成一种树结构
XML文档必须包含根元素。该元素是所有其他元素的父元素。
XML文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
所有元素均可拥有子元素:
1 2 3 4 5 <root > <child > <subchild > .....</subchild > </child > </root >
父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。
所有元素均可拥有文本内容和属性(类似 HTML 中)。 实例
domtree
上图表示下面的 XML 中的一本书:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <bookstore > <book category ="COOKING" > <title lang ="en" > Everyday Italian</title > <author > Giada De Laurentiis</author > <year > 2005</year > <price > 30.00</price > </book > <book category ="CHILDREN" > <title lang ="en" > Harry Potter</title > <author > J K. Rowling</author > <year > 2005</year > <price > 29.99</price > </book > <book category ="WEB" > <title lang ="en" > Learning XML</title > <author > Erik T. Ray</author > <year > 2003</year > <price > 39.95</price > </book > </bookstore >
例子中的根元素是<bookstore>
。文档中的所有 <book>
元素都被包含在 <bookstore>
中。
<book>
元素有 4 个子元素:<title>
、<author>
、<year>
、<price>
。
XML在不同语言里解析方式都是一样的,只不过实现的语法不同。基本的解析方式有两种,一种是DOM,另一种是SAX。DOM是基于XML文档树结构的解析,SAX是基于事件流的解析。 本文介绍Java解析xml文档的几种方法。
##DOM解析xml文档 为xml文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的DOM树结构,然后可以使用DOM接口来操作这个树结构。 优点 :整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能。 缺点 :将整个文档调入内存(包括无用的节点),如果文档过大,则占用过多空间且浪费时间。 适用场合 :一旦解析了文档还需多次访问这些数据,硬件资源充足(内存、CPU)。
解析代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 public class DomTest { public void parseXmlPath (String xmlPath) throws Exception { parseXmlFile(new File(xmlPath)); } private void parseXmlFile (File file) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); Element root = doc.getDocumentElement(); parseElement(root); } private void parseElement (Element element) { String tagName = element.getNodeName(); NodeList childern = element.getChildNodes(); System.out.println("<" + tagName +">" ); NamedNodeMap map = element.getAttributes(); if (map != null ){ for (int i = 0 ;i<map.getLength();i++){ Attr attr = (Attr) map.item(i); String attrName = attr.getName(); String attrValue = attr.getValue(); System.out.println(" " + attrName +"=\"" +attrValue+"\"" ); } } for (int i=0 ;i<childern.getLength();i++){ Node node = childern.item(i); short nodeType = node.getNodeType(); if (nodeType == Node.ELEMENT_NODE){ parseElement((Element)node); }else if (nodeType == Node.TEXT_NODE){ System.out.println(node.getNodeName()+":" +node.getNodeValue()); }else if (nodeType == Node.COMMENT_NODE){ System.out.print("<!--" ); Comment comment = (Comment)node; String data = comment.getText(); System.out.print(data); System.out.print("-->" ); } } System.out.println("</" +tagName + ">" ); } }
##SAX解析XML文档 为解决DOM的问题,出现了SAX。SAX,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,编写响应这些事件的代码,保存数据。 优点 :不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小。 缺点 :不是持久的;事件过后,若没有保存数据,那么数据丢失;无状态;从事件中只能得到文本,但不知道给文本属于哪个元素。 适用场合 :Applet;只需要XML文档的少量内容,很少回头访问;机器内存小。
代码如下:
##DOM4J解析xml文档 DOM4J是一个非常优秀的Java Xml API,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件。现在很多Java项目中都使用DOM4J读写xml文件,很多Spring项目也是。