SAX提供了一种流式的、事件驱动的XML处理方式,但编写处理逻辑比较复杂,比较适合处理大的XML文件。
DOM和SAX不同,其工作方式是:首先将XML文档一次性装入内存;然后根据文档中定义的元素和属性在内存中创建一个“树形结构”,也就是一个文档对象模型,将文档对象化,文档中每个节点对应着模型中一个对象;然后使用对象提供的编程接口,访问XML文档进而操作XML文档。
DOM加载原理
引入的包
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Comment; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException;
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
这里并没有创建出DOM解析器,只是获得一个用于创建DOM解析器的工厂,接下来需要对上述newInstance()方法得到的docBuilderFactory对象进行一些设置,才能进一步通过DocumentBuilderFactory,得到DOM解析器对象builder。
针对DocumentBuilderFactory对象进行的主要设置包括:
忽略XML文档中的注释;
支持XML空间;
支持XML的包含机制(XInclude)。
XInclude机制允许将XML文档分解为多个可管理的块,然后将一个或多个较小的文档组装成一个大型文档。也就是说,配置文件中,可以利用XInclude机制将其他配置文件包含进来一并处理,下面是一个例子:
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
……
<xi:include href="conf4performance.xml"/>
</configuration>
通过XInclude机制,把配置文件conf4performance.xml嵌入到当前配置文件,这种方法更有利于对配置文件进行模块化管理,同时就不需要再使用加载配置文件的方法加载资源conf4performance.xml了。
设置完DocumentBuilderFactory对象以后,通过docBuilderFactory.newDocumentBuilder()获得了DocumentBuilder对象,
针对DocumentBuilderFactory对象进行的主要设置包括:
忽略XML文档中的注释;
//ignore all comments inside the xml file docBuilderFactory.setIgnoringComments(true);
支持XML空间;
//allow includes in the xml file docBuilderFactory.setNamespaceAware(true);
支持XML的包含机制(XInclude)。
docBuilderFactory.setXIncludeAware(true);
XInclude机制允许将XML文档分解为多个可管理的块,然后将一个或多个较小的文档组装成一个大型文档。也就是说,配置文件中,可以利用XInclude机制将其他配置文件包含进来一并处理,下面是一个例子:
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
……
<xi:include href="conf4performance.xml"/>
</configuration>
通过XInclude机制,把配置文件conf4performance.xml嵌入到当前配置文件,这种方法更有利于对配置文件进行模块化管理,同时就不需要再使用加载配置文件的方法加载资源conf4performance.xml了。
设置完DocumentBuilderFactory对象以后,通过docBuilderFactory.newDocumentBuilder()获得了DocumentBuilder对象,
DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
doc = builder.parse(input);
NodeList props = root.getChildNodes();