a) 使用DOM解析XML文档
Document中提供如下用来访问XML文档中的节点的方法:
Element getDocumentElement():其是用来获取XML文档的根节点;
Element getElementByld(String tagname):其是用来根据XML元素的ID来获取XML元素。
NodeList getElementByTagName(String tagname):其是用来根据XMl标签名获取XML元素。
使用DOM创建XML文档可以先在内存中创建新的DOM树,并未DOM树添加节点,然后将DOM树转换成XML文档即可。Document也提供了很多常用方法来创建节点,如Attr createAttribute(String name),这里就不一一列举。
b) 使用DOM修改XML文档
使用DOM可以修改XML文档,这个操作就比较简单了,首先使用DOM解析器解析已有的XML文档,利用DOM树节点之间的结构关系找到待修改的节点,然后调用各节点对象的方法修改该节点所包含的数据,最后使用LSSerializer再次序列化修改后的DOM树即可完成XML文档的修改。
2.1.2 基于SAX解析
SAX采用事件机制方式来解析XML文档,一种快速读写XML数据的方式。SAX解析器解析XML文档时,会触发一系列事件,这些事件被监听器监听后会触发相应的处理方法,从而实现对XML文档的访问,如图4.2所示。
2.2 SAX解析图解
在SAX解析器着手解析时就开始发送事件,当SAX解析器着手处理文档开始、元素开始和文本时,就会在文档中触发一个事件,那么监听器就开始负责处理这些事件,事件中包含XML元素的内容,即元素值和属性,从而实现对XML文档信息的读取。
a) 使用DOM解析XML文档
SAX解析器不创建任何对象,它只在遇到XML文档的各种标签时触发相对应的事件,而且将XML文档的元素内容封装成事件传出去。使用XMLReader和XMLReaderFactory这组API来解析XML文档的话,可以先通过调用XMLReaderFactory的createXMLReader()方法来建立一个XMLReader对象,如果希望启动SAX解析器的原生特性,可多次调用XMLReader对象的setFeature()方法。然后分别调用XMLReader的setContentHandler、setDTDHandler、setEntityResolver和setErrorHandler方法来绑定多个事件监听函数。最后调用XMLReader的parse()方法来解析XML文档。
使用XML解析器解析XML文档时,同样可以使用DTD来验证XML文档的有效性。通过以上的介绍,使用SAX解析XML文档也很容易实现。使用SAXParser和SAXParserFactory这组API来解析XML文档的话,可以先通过SAXParserFactory的newInstance()方法创建SAX解析器工厂对象,再调用SAXParserFactory对象的newSAXParser()方法创建SAXparser对象,最后调用SAXParser对象的parser()方法解析XML文档即可,不过调用该方法时需要传入一个DefaultHandler对象。
2.1.3 基于JDOM解析
JDOM也是Java中常用的解析XML文档的方法,他整合了DOM解析的简单易行和SAX解析的性能优越两大特点。
使用JDOM解析XML文档,首先其将XML文档转换成一个Document对象,相当于XML文档的根节点,获得该节点所用到的类为SAXBuilder,然后可以利用已得到的Document节点的getRootElement()方法,得到根元素,其提供了getChildren()方法可以获得子节点。但是不能使用getRootElement()方法获得属性。所以要获得属性,要使用的方法是getAttribute(String attributeName),可以通过getAttributeValue(String attributeName)获得该属性的值。使用JDOM也可以创建XML文档,删除并修改节点。
a) 解析XML文档