在Java中,对xml的处理模型主要有两种,一种DOM,一种是SAX。DOM是w3c提出的一个xml处理模型,需要在内存中保存整个XML文档的相关信息,好处是灵活性强,可以对XML文档的任何部分以任何顺序进行处理,缺点是耗内存。SAX是开源社区提出的一套API,与DOM不同,它不是规范,但是由于其使用的广泛性,可以把SAX看作是一个事实上的规范。SAX把XML文档当作一个流来处理,而不是把整个XML文档读到内存之后再处理,所以占用的内存非常少。但是SAX只支持一次性地读取,也就是说你无法回到之前处理过的XML节点,而且SAX只支持读取XML,而支持XML的写入。同时,SAX以事件的形式向客户端报告解析XML过程中遇到的各种合法的XML结构(如果标签,属性,内容等等),SAX以推(push)的方式来报告事件,所以客户端无法主动调用SAX的API来获取XML文档的内容,并且在SAX解析XML文档的过程中,调用者线程必须等待,知道整个解析过程完成为止。SAX 2.0和DOM level 2和3的都已经包含进JDK。
由于DOM和SAX都是API形式的规范,所以可以有很多不同的实现,为了支持不同的实现,DOM和SAX都提供了一些工厂方法来查找具体的实现者,同时在工厂方法中也规定了如何查找相应的实现者以及查找的顺序。
对于DOM来说,主要的工厂方法是org.w3c.dom.bootstrap.DOMImplementationRegistry.newInstance()方法,在JDK的文档中,是这样描述其实现的:
Obtain a new instance of a DOMImplementationRegistry. The DOMImplementationRegistry is initialized by the application or the implementation, depending on the context, by first checking the value of the Java system property org.w3c.dom.DOMImplementationSourceList and the the service provider whose contents are at "META_INF/services/org.w3c.dom.DOMImplementationSourceList" The value of this property is a white-space separated list of names of availables classes implementing the DOMImplementationSource interface. Each class listed in the class name list is instantiated and any exceptions encountered are thrown to the application.
从jdk的说明来看,首先会检查org.w3c.dom.DOMImplementataionSourceList这个系统属性,然后检查API实现者提供的jar包中的META_INF/service/org.w3c.dom.DOMImplementationSourceList文件,系统属性和文件中列出了实现了DOMImplementationSource接口的所有的实现类,系统属性和jar保重的文件(Java Service Provider规范)只取一个,优先使用系统属性。在得到了DOMImplementationRegistry实例之后,就可以调用它的getDOMImplementation(String features)的方法来获取DOMImplementation接口的实现类,DOMImplementation接口提供了方法用来创建Doument对象。
对于SAX来说,主要的工厂方法是org.xml.sax.helpers.XMLReaderFactory.createXMLReader()方法,在jdk中,其实现描述如下:
Attempt to create an XMLReader from system defaults. In environments which can support it, the name of the XMLReader class is determined by trying each these options in order, and using the first one which succeeds:
1.If the system property org.xml.sax.driver has a value, that is used as an XMLReader class name.
2.The JAR "Services API" is used to look for a class name in the META-INF/services/org.xml.sax.driver file in jarfiles available to the runtime.
3.SAX parser distributions are strongly encouraged to provide a default XMLReader class name that will take effect only when previous options (on this list) are not successful.
3.Finally, if ParserFactory.makeParser() can return a system default SAX1 parser, that parser is wrapped in a ParserAdapter. (This is a migration aid for SAX1 environments, where the org.xml.sax.parser system property will often be usable.)
In environments such as small embedded systems, which can not support that flexibility, other mechanisms to determine the default may be used.
Note that many Java environments allow system properties to be initialized on a command line. This means that in most cases setting a good value for that property ensures that calls to this method will succeed, except when security policies intervene. This will also maximize application portability to older SAX environments, with less robust implementations of this method.
过程基本和DOM工厂类的查找过程类似,只不过系统属性和文件名改成了org.xml.sax.driver。通过createXMLReader方法返回的XMLReader实例可以被用来对XML文档进行解析。
为了统一对DOM和SAX两种不同的XML模型的处理,Sun在其JDK中加入了一个JAXB规范。通过这个规范,使得替换DOM或者SAX的解析器不至于调整应用程序代码。通过JAXB创建DOM和SAX解析器的类在javax.xml.parsers中,具体使用方式可以查看JDK文档。另外,由于通过DOMImplementationRegistry、DOMImplementation接口只能创建Document而不能根据XML生成Document对象,所以,如果要通过现有的XML来生成Document对象只能通过JAXP的API或者DOM规范实现方提供的具体方法。
最后是Sun提出的Streaming API,Streaming API与SAX类似,也是通过流和事件的方式来处理XML文档。与SAX相比,主要有两方面的区别:
1.StAX(The Streaming API for XML)不仅支持读取XML文档,同时也支持创建XML文档
2.StAX以拉(pull)的方式提供XML文档的相关信息,也就是说,StAX对XML的解析过程由客户端程序控制。StAX提供的XMLStreamReader和XMLEventReader接口都提供了next()方法,使得客户端程序能够获取XML文档中的内容。关于XMLStreamReader和XMLEventReader两者的区别,参考:The Java Web Services Tutorial
StAX中的工厂类主要有三个,分别是XMLEventFactory、XMLInputFactory和XMLOutputFactory,都为与javax.xml.stream包下面。这些工厂类提供的工厂方法用来获取相应的XML读写类。具体的使用方式,可以查看JDK的文档。
分享到:
相关推荐
Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得在Java应用程序中使用XML数据变得更加方便,无需手动编写大量的转换代码。本教程将详细介绍JAXB如何实现...
##### Java中XML转HTML技术概述 在Java环境中,实现XML文档向HTML文档转换的技术主要依赖于XSLT(Extensible Stylesheet Language Transformations)和相关的API如JAXP(Java API for XML Processing)。XSLT是一种...
Java XML、XSL、HTML 文件转换技术概述 Java XML、XSL、HTML 文件转换是软件开发中的一种常见技术,主要用于将 XML 文件转换为 HTML 文件或其他格式的文件。下面将对该技术进行详细介绍。 XML 文件是什么? XML...
Java中提供的JAXP标准规范是基于W3C DOM和SAX规范创建的,支持使用SAX、XSLT和DOM的XML处理,并为SAX和DOM API提供一致性。通过JAXP,可以使用任何与其兼容的XML解析器。JAXP接口包含了以下几个包: - `org.w3c.dom...
Java提供了多种处理XML的技术,包括DOM(Document Object Model)、SAX(Simple API for XML)、JDOM、JAXB(Java Architecture for XML Binding)以及dom4j等。本文将详细介绍这些技术及其应用场景。 #### 二、DOM...
在Java中,处理XML文档时,Java API for XML Parsing(JAXP)是一个核心工具集,它提供了在Java环境中解析XML的接口和类。 **XML的基本概念** XML文档由元素、属性、文本和注释组成。元素是XML文档的基本构建块,...
- `org.jdom`: 一个开源的 Java API 用于处理 XML 文档。 2. **Excel 文件读取** - 使用 Apache POI 库读取 Excel 文件中的数据。 - 解析 Excel 工作表、行和单元格。 3. **XML 文件生成** - 使用 JDOM 创建 ...
以上内容概述了Java中处理XML的基本方法。在实际应用中,可能还需要考虑性能优化,例如使用SAX(Simple API for XML)或StAX(Streaming API for XML)进行事件驱动的解析,以减少内存消耗。此外,JAXB还提供了XML ...
Java提供了多种API来处理XML文件,包括SAX、DOM以及更现代的JSoup等。本文将详细介绍如何使用Java标准库中的DOM API来读取与写入XML文件。 #### 二、DOM API介绍 DOM(Document Object Model)是W3C推荐的标准,它...
#### 二、Java XML绑定技术概述 Java XML绑定技术(简称XML Binding)是一种能够自动将XML文档映射到Java对象的工具和技术,从而使得开发人员能够更方便地操作XML数据。通过使用这些技术,开发人员可以将复杂的XML...
### Java XML 学习手册知识点概述 #### 一、引言 《Java™, XML, and JAXP》是一本由Arthur Griffith编写的专著,深入探讨了Java平台与XML技术之间的融合及其应用实践。本书由John Wiley & Sons, Inc.出版,并在多...
Java JDOM解析XML是Java开发中处理XML文档的一种方法,JDOM全称为Java Document Object Model,它是一个基于Java语言的API,用于创建、修改和读取XML文档。JDOM为XML处理提供了一种高效且方便的解决方案,尤其适用于...
为了处理 POST 请求中的 XML 数据,`dxServlet.java` 使用了 SAX(Simple API for XML)解析器。SAX 是一种基于事件驱动的 XML 解析方式,非常适合大型文档的解析。它不一次性加载整个 XML 文档到内存中,而是随着...
#### 二、Java XML 解析技术概述 Java中有几种主要的方式来解析XML文件,主要包括DOM (Document Object Model),SAX (Simple API for XML) 和 StAX (Streaming API for XML)。此外,还有用于XML转换的技术如XSLT ...
xmlbeans-3.0.1.jar是一个用于处理XML文档的Java库,它提供了强大的XML数据绑定和解析功能,使开发者能够更轻松地在Java应用中操作和处理XML数据。 【使用人群】 适用于Java开发者、数据处理专家和需要在Java应用中...
2. **开发使用Java处理XML的技术**:通过教授如何使用SAX(Simple API for XML)、DOM(Document Object Model)和XSLT(Extensible Stylesheet Language Transformations)等技术来编写Java应用程序。 #### 二、...
在Java中,XML的处理主要包括生成和解析两个方面,而解析又可以进一步细分为DOM和SAX两种主要方式。此外,还有基于StAX(Streaming API for XML)和JAXB(Java Architecture for XML Binding)的方式。 #### 二、...
"http://www.apress.com/javaxml/dtd/journal.dtd"> ``` XML 注释通过 `<!-- ... -->` 进行添加,例如: ```xml <!-- This is a comment --> ``` 一个完整的 XML 示例可能包括上述所有元素: ```xml <?xml ...
Java语言在处理XML数据时,提供了多种解析器,其中StAX(Streaming API for XML)是一种高效、低内存占用的选择,特别适合大型XML文档处理。本示例将介绍如何使用StAX进行XML读取,这对于初学者来说是一个很好的起点...