本文介绍了各种解析方法,着重分析了各自的优缺点:
解析的重要性
解析为什么重要?因为所有 XML 处理都从解析开始。无论使用高层编程语言(如 XSLT)还是低层 Java 编程,第一步都是要读入 XML 文件,解码结构和检索信息等等,这就是解析。
解析文档时面临的第一个选择是采用现成的解析库(基本上每种编程语言都有,包括 COBOL [Common Business Oriented Language])还是自己创建一个。答案非常简单:选择现成的库。
坦白地说,XML 不是一种多么复杂的语法,因此认为可以自己通过正则表达式或其他特殊方法来解析的想法是可以理解的。但实际上却很难成功:XML 语法要求支持多种编码和很多难以捉摸的特性,比如 CDATA 节和实体。自定义的实现几乎很难照顾到所有这些方面,因而造成了不兼容性。
相反,随开发环境提供的解析器大都经过了与兼容性有关的测试。采用 XML 这样的标准语法的主要原因是兼容其他应用程序和工具箱,这是真正值得使用经过良好测试的库的情况之一。
多数解析器提供了至少两种 API,通常是一个对象模型 API 和一个事件 API(也称为流 API)。比如,Java 平台同时提供了 DOM(文档对象模型)和 SAX(Simple API for XML)。
这两套 API 提供了相同的服务:文档解码、可选的验证、名称空间解析等等。差别不在于服务而在于 API 使用的数据模型。
关键的选择:第一种方法
对象模型 API 定义了层次化对象模型来表示 XML 文档。换句话说,对应 XML 语法中的每个概念定义相应的类:元素、属性、实体、文档。解析器读入 XML 文档的时候,建立 XML 语法和类之间的一对一映射。比如,每遇到一个标记,就实例化一个元素类。
毫不奇怪,对哪种数据模型最好存在一些争议。W3C 规范化了 DOM,它的主要优点是可移植性:它是作为一种 CORBA 接口定义的,被映射到很多语言。因此如果了解了 JavaScript 中的 DOM,也就知道了 Java、C++、Perl、Python 和其他语言中的 DOM。
另一种数据模型是 JDOM,一种针对 Java 优化的 DOM(专用于 Java),和 Java 语言结合得更紧密,但是按照定义缺乏可移植性。
尽管人们可以继续商讨对 XML 语法来说哪种数据模型最好,但我认为没有多少意义,因为各种基于对象的 API 其优点和不足基本上是一样的。从好的方面来说,如果熟悉 XML 语法的话,对象模型 API 更容易理解。因为它直接从 XML 语法映射到类,很容易学习、使用和调试。
简单的代价是效率,至少对很多项目而言是这样。读入文档的时候,解析器根据语法结构创建对象。对很多应用程序来说,XML 语法并不是很合适:
XML 语法非常罗嗦,即使文档很小,解析器也要创建很多对象。
对 XML 词汇表进行的优化通常针对的是存储和数据传输效率,而不是处理,因而应用程序可能需要对数据进行预处理,比方说,在开始真正的处理之前,先计算部分和或者合并其他来源的数据。很多情况下,在处理之前必须将数据从 XML 对象模型复制到应用程序专用的对象模型或者数据库。
因为这种对象模型是通用的,包含很多应用程序并不需要的对象之间的引用(比如,从子元素到父元素的反向引用)。这些引用进一步增加了内存消耗。
在桌面上处理小型文档这可能不是大问题,但是在其他环境中,比如服务器上,对象模型固有的低效率是不可接受的。
第二种方法
第二种选择是事件 API,比如 SAX。这个概念是上述对象模型方式的一种反映。只不过这种方法不根据 XML 语法定义通用的数据模型,其解析器依赖应用程序程序员建立定制的数据模型。
因此解析器可以做得更小,因为只需要传递最少量的信息。更重要的是,和一个型号打天下的对象模型(不管对象模型多么好)相比总的效率更高,程序员可以根据应用程序的需要定制对象模型。
它的优点很明显:
统计应用程序或总结信息的任何应用程序都可以从中获益,因为它们的数据模型只需计算总计而无需复制整个文档。
类似的,即使动态处理文档的应用程序(比如把文档加载到数据库中)不需处理或者只需少量处理,也可从中受益,因为根本不需要存储数据。
由于减少了内存需求,事件 API 可以处理任意大小的文档,包括大小超过可用内存的文档。基于同样的原因,这类 API 也非常适合多个进程并发执行和共享内存的服务器。
效率的代价是简单性的损失。事件 API 一向以难用著称,因为应用程序员要负责更多的操作。虽然短期看来如此,但根据我的经验,从中期和长期来看,效率上的改进足以抵消略微增加的复杂度。
流式 API 有两种形式:推式和拉式。从历史上看,推式方法更加流行,因为这正是 SAX 采用的模型。推式方法正在实现标准化,很快将作为 StAX 集成到 Java 平台中。
两者有什么区别呢?区别在于由谁控制读循环。和读取文件的任何软件一样,解析器也是围绕着读循环(读入文件的循环)创建的。
在推 模式(SAX)下,解析器控制循环。实际上应用程序调用解析器的时候,在文件结束之前控制权不会返回给应用程序。前面已经提到,解析器回调应用程序以建立数据模型,解析器处于控制地位。
在拉 模式下,应用程序控制循环。循环中应用程序负责反复调用解析器,直到文件结束。
推模式最适合边读入边处理 XML 文档,比如读入 RSS 提要并显示为 HTML 网页。对于使用 XML 存储数据的多数应用程序来说,“读文档”用对解析器的一次调用实现最方便。
拉模式更适合于处理不同 XML 词汇表的文档。这类应用程序通常需要嗅探输入(读入前几行)以根据词汇表决定调用子例程。
对于控制解析器的应用程序而言,一次循环是必要的,因为应用程序很容易在嗅探前面几行之后停止读入。
第三种方法
如果不提到另一种选择,即 XML 编组库形式的解析,如 Castor,本文就不完整。该方法介于对象模型和事件方法之间。
其思想是从 XML Schema 生成一个对象模型而不是通用模型(如 DOM),解析器生成更加针对所用词汇表的数据模型。比方说,如果词汇表处理的是发货单,那么可以预料其中会包含发送方、接收方、日期、产品类别、产品标识、单价和总价。DOM 将这些元素映射到一个一般性的元素类。编组库 为发送方、接收方、日期、产品类别、产品标识、单价、总价和文档中出现的其他元素创建专门的类。
从处理的是根据词汇表定制(与根据应用程序的需要定制可能相同,也可能不同)的而不是通用数据模型这方面来讲,编组库具备事件 API 的一些优点。
如何写入 XML 呢?
解析器读取和解码 XML 文档,将其从磁盘上转到内存中。那么另一个方向上的移动该如何处理呢?如果应用程序需要将数据存储到 XML 文件中怎么办?
虽然我建议您避免使用特殊的例程解码 XML 文档,但是对于写入 XML 没有这样的疑虑。读的时候必须保证实现了所有的规则,包括一些隐晦之处。但是写入的时候,则可以实现一个小型的、可工作的词汇表子集。
但是多数对象模型 API 仍然承担了双重职责,除了读以外还要能将对象树写入磁盘。如果使用事件 API,就可以从数据结构生成写事件
分享到:
相关推荐
本文将深入探讨三种主要的XML解析方法:DOM解析、SAX解析和DOM4J解析,并分析它们各自的特点和优势。 1. DOM解析(Document Object Model) DOM解析器将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。...
Android 中提供了多种 XML 解析方法,包括 SAX、DOM 和 Pull 解析器。 * SAX(Simple API for XML)解析器是一种基于事件的解析器,它可以将 XML 文件解析为一系列事件,然后使用回调函数处理这些事件。SAX 解析器...
在本Demo "xmlDemo" 中,可能包含了以上提到的一种或多种XML解析方法的实现示例。通过运行这个Demo,开发者可以在后台看到XML数据被解析并打印出来的结果。这有助于理解每种方法的工作原理,并且为实际项目中的XML...
DOM4J支持多种XML解析方法,包括DOM、SAX和STAX,同时也支持XPath表达式来查找XML文档中的节点。以下是一些关于DOM4J的关键知识点: 1. **DOM4J的API**:DOM4J提供了一套丰富的接口和类,如Document、Element、...
压缩包中的资源提供了多种XML解析方法和技术: 1. "C++语言实现XML文件解析的一种方案.pdf":这可能是一份关于使用C++编程语言解析XML的教程。C++中常见的XML解析库有TinyXML、pugixml、Xerces-C++等。这些库提供了...
总结,Android平台提供了多种XML解析方法,开发者可以根据具体需求选择合适的解析器。DOM适用于小规模数据,SAX和Pull解析器适合大型XML文件,而XmlResourceParser则方便处理资源XML。理解并熟练运用这些解析方法,...
XML 在 Android 开发中是一个非常重要的技术,.Android 平台支持多种 XML 解析方法,开发者可以根据需要选择合适的解析方法。在本文中,我们介绍了 XML 在 Android 中的应用、XML 解析方法和使用 XML 的优点。
LabVIEW提供了多种解析XML的方法,如DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器会将整个XML文档加载到内存中,形成一棵树形结构,允许用户遍历和操作每个节点。而SAX解析器则是事件驱动的...
XML(eXtensible Markup Language)...总结起来,C# 提供了多种XML解析方法,如DOM、SAX和LINQ to XML,每种方法都有其适用场景。开发者可以根据项目需求选择合适的方式,结合TextTool等辅助工具,高效地处理XML数据。
通过这些示例,开发者可以对比不同库的使用方法和性能表现,根据实际项目需求选择最适合的XML解析库。例如,如果需要高效的XPath查询,GDataXML或KissXML可能是更好的选择;而如果关心内存效率和速度,TBXML可能更...
本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...
Java XML解析是Java开发中的一项重要技能,尤其是在处理结构化数据时。XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换和文档存储等领域。本压缩包“java心电图xml解析....
JavaScript中的XML解析器是用于... - 避免在不支持的浏览器中使用特定的XML解析方法,考虑使用polyfills或降级策略。 通过理解以上知识点,开发者能够更好地在JavaScript环境中处理XML数据,构建高效且健壮的Web应用。
在实际开发中,开发者可以根据项目需求和性能考虑选择合适的XML解析方法和库。 总的来说,XML解析是软件开发中的基础技能,掌握MSXML解析器的使用对于在Windows环境下处理XML数据至关重要。理解DOM和SAX两种解析...
C++中解析XML文件的方法多种多样,这里我们将重点介绍使用TinyXML库的方法,因为这是你提供的压缩包文件名。 TinyXML是一个开源、小巧且易于使用的C++库,专门用于XML文件的读取和写入。下面我们将详细介绍如何使用...
选择合适的XML解析方法取决于具体的应用场景和需求。对于需要频繁修改文档内容或需要随机访问的场景,DOM可能是更好的选择;而对于需要高效处理大型文档或实时数据流的应用,则SAX会更有优势。最终,开发人员应该...
VTD-XML是一款高效、灵活且功能强大的XML解析工具,由XimpleWare公司开发。它在XML处理领域中因其性能优异、内存占用低而受到广泛关注。"多快好省地建设社会主义"这句话虽然是一种比喻,但形象地表达了VTD-XML在处理...
XML(eXtensible ...总的来说,XML是IT领域不可或缺的数据交换格式,熟练掌握XML及其解析方法,对于提升开发能力具有重要意义。无论是新手还是经验丰富的开发者,都需要不断学习和实践,以适应各种XML相关的任务。
XML(eXtensible Markup Language)是一...总之,这个“XML解析工具类”是一个便捷的资源,提供了多种XML解析方式,适用于不同的场景和需求。不论你是初学者还是经验丰富的开发者,都能从中受益,更高效地处理XML数据。
本资源包主要关注的是Linux环境下的XML解析,特别是开源代码的应用。 标题中的“Linux XML解析资源”指的是在Linux操作系统中处理和解析XML文档的相关工具和技术。在Linux世界里,由于其开源和自由软件的理念,有...