`
l_rui_ci
  • 浏览: 39997 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

了解各种 XML 解析方法

    博客分类:
  • XML
阅读更多
即便对高级 XML 问题具有丰富经验的开发人员也不一定就完全了解 XML 最基本的一些问题。为了为您打下坚实的基础,本文讨论了最基本的 XML 服务:解析。本文介绍了各种解析方法,着重说明了各自的优缺点。
2D7U(|-i+K)K8R'J/k
4|-@:u0l;A+}/W  了解基础
;F+C&A4z,gtech.techweb.com.cn7l*C3c!o1q4f/@
  从 XML 的出现至今大约有 9 年的时间了。对于可扩展标记语言来说这是一段不短的历程。现在很难找到完全不用 XML 的应用程序了。TechWeb-技术社区3b.e/E2m-J7V+{.D

"{#w1L3R'bTechWeb-技术社区  但是和客户在一起的时候,仍然不可避免地发现基础性的东西尚未被透彻地全部理解。对复杂的 XML 主题理解透彻的开发人员,最近却发现对基础性的东西(比如解析)的把握还存在很多不足,这真有点出人意料。
#H#k/?5r9Z%s
/R,f9^4i7l;V  而对 XML 的处理是从何处开始的呢?没错,是解析。解析可能是开发人员能够使用的最基本的服务。解析器读取 XML 文档,解释语法并向应用程序传递有意义的对象。解析器可能还提供其他服务,比如验证(保证文档符合 XML Schema 或 DTD)或者名称空间解析。
+V!p1\2s8|+K,Ctech.techweb.com.cn;h+|8J4X&F&s3T7[8n
  本文介绍了各种解析方法,着重分析了各自的优缺点,帮助您在下一个项目中选择适当的工具。文中包含大量文章的链接,选择工具的时候可以详细研究给定的 API。
9m!D)l X/gTechWeb-技术社区
(o+n$P(|!y9g9I0@  解析的重要性
*T!h$t5s3D/e5j-O!`
+j%W%X0t)Y-z  解析为什么重要?因为所有 XML 处理都从解析开始。无论使用高层编程语言(如 XSLT)还是低层 Java 编程,第一步都是要读入 XML 文件,解码结构和检索信息等等,这就是解析。tech.techweb.com.cn)A)Y&z @-t;O)v

(`!Q+B6R1h0^:Dtech.techweb.com.cn  解析文档时面临的第一个选择是采用现成的解析库(基本上每种编程语言都有,包括 COBOL [Common Business Oriented Language])还是自己创建一个。答案非常简单:选择现成的库。TechWeb-技术社区3J5g+Y#v%k$K*Q

8e6i5} \;Q(A2o3O"s.g  坦白地说,XML 不是一种多么复杂的语法,因此认为可以自己通过正则表达式或其他特殊方法来解析的想法是可以理解的。但实际上却很难成功:XML 语法要求支持多种编码和很多难以捉摸的特性,比如 CDATA 节和实体。自定义的实现几乎很难照顾到所有这些方面,因而造成了不兼容性。
.x0v)}!`9z;P!F
8F!Y/V$V,Q#v  相反,随开发环境提供的解析器大都经过了与兼容性有关的测试。采用 XML 这样的标准语法的主要原因是兼容其他应用程序和工具箱,这是真正值得使用经过良好测试的库的情况之一。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛6[!P'm4S8K

8A2p0A7I)S7c%B.I:N  多数解析器提供了至少两种 API,通常是一个对象模型 API 和一个事件 API(也称为流 API)。比如,Java 平台同时提供了 DOM(文档对象模型)和 SAX(Simple API for XML)。
#a8C*t7P {/R/K(LTechWeb-技术社区程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛3e-q:d'c#t&r&\'R8Z&O
  这两套 API 提供了相同的服务:文档解码、可选的验证、名称空间解析等等。差别不在于服务而在于 API 使用的数据模型。
&}$}%{&g0?
5T1e/a d$M0}  关键的选择:第一种方法程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛;~/g Q-X8Y"w
TechWeb-技术社区'j#J3K7m)O"D-t(x
  对象模型 API 定义了层次化对象模型来表示 XML 文档。换句话说,对应 XML 语法中的每个概念定义相应的类:元素、属性、实体、文档。解析器读入 XML 文档的时候,建立 XML 语法和类之间的一对一映射。比如,每遇到一个标记,就实例化一个元素类。
%a:Q"f*f:v%M3fTechWeb-技术社区
!_9l%g;B6O!yTechWeb-技术社区  毫不奇怪,对哪种数据模型最好存在一些争议。W3C 规范化了 DOM,它的主要优点是可移植性:它是作为一种 CORBA 接口定义的,被映射到很多语言。因此如果了解了 JavaScript 中的 DOM,也就知道了 Java、C++、Perl、Python 和其他语言中的 DOM。程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛4s)}0r"E&L _ _*r&m9y
7Z,p)F,`'m2W/f6e
  另一种数据模型是 JDOM,一种针对 Java 优化的 DOM(专用于 Java),和 Java 语言结合得更紧密,但是按照定义缺乏可移植性。2y w5Q#z'|.P7s'Z2w3d
TechWeb-技术社区*W5A(f1d.y4y%b:]
  尽管人们可以继续商讨对 XML 语法来说哪种数据模型最好,但我认为没有多少意义,因为各种基于对象的 API 其优点和不足基本上是一样的。从好的方面来说,如果熟悉 XML 语法的话,对象模型 API 更容易理解。因为它直接从 XML 语法映射到类,很容易学习、使用和调试。
&M:F4k"O2X)Ftech.techweb.com.cnTechWeb-技术社区"J1y.z1{2F3f9c:w0G5C
  简单的代价是效率,至少对很多项目而言是这样。读入文档的时候,解析器根据语法结构创建对象。对很多应用程序来说,XML 语法并不是很合适:
&T#k:L a*e+m;@6\TechWeb-技术社区
!~(n!S%K'V'o  XML 语法非常罗嗦,即使文档很小,解析器也要创建很多对象。 TechWeb-技术社区+z9i+s3u9W
  对 XML 词汇表进行的优化通常针对的是存储和数据传输效率,而不是处理,因而应用程序可能需要对数据进行预处理,比方说,在开始真正的处理之前,先计算部分和或者合并其他来源的数据。很多情况下,在处理之前必须将数据从 XML 对象模型复制到应用程序专用的对象模型或者数据库。
*x.j-m/M's;GTechWeb-技术社区  因为这种对象模型是通用的,包含很多应用程序并不需要的对象之间的引用(比如,从子元素到父元素的反向引用)。这些引用进一步增加了内存消耗。&? u2F0z%P6k3t(v4?1k"c
  在桌面上处理小型文档这可能不是大问题,但是在其他环境中,比如服务器上,对象模型固有的低效率是不可接受的。
第二种方法TechWeb-技术社区.S.q$q7c3})@1P
.K(_!}!S7J"j;B3@
第二种选择是事件 API,比如 SAX。这个概念是上述对象模型方式的一种反映。只不过这种方法不根据 XML 语法定义通用的数据模型,其解析器依赖应用程序程序员建立定制的数据模型。;^&r1X;z,e R0t
TechWeb-技术社区&f$H;S$n'V c
因此解析器可以做得更小,因为只需要传递最少量的信息。更重要的是,和一个型号打天下的对象模型(不管对象模型多么好)相比总的效率更高,程序员可以根据应用程序的需要定制对象模型。
-i&C(R/y8t
0n,F/s"]:`.H,|7_4~tech.techweb.com.cn它的优点很明显:!Y5s2x8m'R8t9} ^
3L8X6r5s(O;}
统计应用程序或总结信息的任何应用程序都可以从中获益,因为它们的数据模型只需计算总计而无需复制整个文档。
/]4r+u-G+v*W#Z9J6E,F类似的,即使动态处理文档的应用程序(比如把文档加载到数据库中)不需处理或者只需少量处理,也可从中受益,因为根本不需要存储数据。 tech.techweb.com.cn0k8v2j3o0`'L.d1r%K
由于减少了内存需求,事件 API 可以处理任意大小的文档,包括大小超过可用内存的文档。基于同样的原因,这类 API 也非常适合多个进程并发执行和共享内存的服务器。 tech.techweb.com.cn&D3t4b)K/B)o"A

$d3L6m7_"q4q效率的代价是简单性的损失。事件 API 一向以难用著称,因为应用程序员要负责更多的操作。虽然短期看来如此,但根据我的经验,从中期和长期来看,效率上的改进足以抵消略微增加的复杂度。
8?+y6Y$f {)q#{)c&|%w GTechWeb-技术社区8p1t$r6J,D8D.x$P1k
流式 API 有两种形式:推式和拉式。从历史上看,推式方法更加流行,因为这正是 SAX 采用的模型。推式方法正在实现标准化,很快将作为 StAX 集成到 Java 平台中。TechWeb-技术社区*Y2a4g;r7D7e
8^4J.d;A$n:X w
两者有什么区别呢?区别在于由谁控制读循环。和读取文件的任何软件一样,解析器也是围绕着读循环(读入文件的循环)创建的。tech.techweb.com.cn7I/^,D0m#V&k3[-H"@
.j+N'z)M-S$A&r
在推 模式(SAX)下,解析器控制循环。实际上应用程序调用解析器的时候,在文件结束之前控制权不会返回给应用程序。前面已经提到,解析器回调应用程序以建立数据模型,解析器处于控制地位。
6v'C"{*w-q2~1\程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
/h(F7J8d#r h!L4N&h在拉 模式下,应用程序控制循环。循环中应用程序负责反复调用解析器,直到文件结束。#p/\7D1A/h p/o*c5d!I

's7H-s(l$A/}4w2\(R6e8e推模式最适合边读入边处理 XML 文档,比如读入 RSS 提要并显示为 HTML 网页。对于使用 XML 存储数据的多数应用程序来说,“读文档”用对解析器的一次调用实现最方便。+Y-d9j3_.r4F9S'O.i#?

8|%s/o"C3cTechWeb-技术社区拉模式更适合于处理不同 XML 词汇表的文档。这类应用程序通常需要嗅探输入(读入前几行)以根据词汇表决定调用子例程。0]4o&n0s.w)D
)l;m.z9n.z%~
对于控制解析器的应用程序而言,一次循环是必要的,因为应用程序很容易在嗅探前面几行之后停止读入。
2f/u'Q6Z+G)|.~程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛TechWeb-技术社区5s9T7X9F#e8\6f0G
第三种方法
$i0m9o)h/V:P'N(n8`:D
'f._3p)k'M如果不提到另一种选择,即 XML 编组库形式的解析,如 Castor,本文就不完整。该方法介于对象模型和事件方法之间。tech.techweb.com.cn;q ?,d-s7E5E1[
tech.techweb.com.cn3v6t6d-P6k;Z$W;{-X$\ v/D
其思想是从 XML Schema 生成一个对象模型而不是通用模型(如 DOM),解析器生成更加针对所用词汇表的数据模型。比方说,如果词汇表处理的是发货单,那么可以预料其中会包含发送方、接收方、日期、产品类别、产品标识、单价和总价。DOM 将这些元素映射到一个一般性的元素类。编组库 为发送方、接收方、日期、产品类别、产品标识、单价、总价和文档中出现的其他元素创建专门的类。
N/L"R$R+?,@6[程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
4i&r)?#a*P$c从处理的是根据词汇表定制(与根据应用程序的需要定制可能相同,也可能不同)的而不是通用数据模型这方面来讲,编组库具备事件 API 的一些优点。0R5g*}9S.J;W7f2j c

;f-a+Y;D8q9f+?$b(p0]#j如何写入 XML 呢?程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛0A+o7i"] k2Q'_,g"b(S
(J"b*j3^.E(G6R(Z
解析器读取和解码 XML 文档,将其从磁盘上转到内存中。那么另一个方向上的移动该如何处理呢?如果应用程序需要将数据存储到 XML 文件中怎么办?
#f&K3F6S%t2S#E)x5G7m"y(I5N&I;o(s-U)r
虽然我建议您避免使用特殊的例程解码 XML 文档,但是对于写入 XML 没有这样的疑虑。读的时候必须保证实现了所有的规则,包括一些隐晦之处。但是写入的时候,则可以实现一个小型的、可工作的词汇表子集。
6_6i,X)W*X)q.i
3V4\ n;X%P&o8H4C9`6T7Itech.techweb.com.cn但是多数对象模型 API 仍然承担了双重职责,除了读以外还要能将对象树写入磁盘。如果使用事件 API,就可以从数据结构生成写事件
分享到:
评论

相关推荐

    Java中四种XML解析技术详解

    Java中四种XML解析技术详解 更好的更快速的了解xml中的四种解析技术

    XML解析原理Demo详解

    在Demo中,解析XML到前台显示用的是JDOM,而在模拟Bean工厂解析spring-config的时候,用的是DOM4J的解析方式,两者各有优点,如果你细心的话,可在源代码中发现两者的区别,祝你也早日了解XML的解析原理。

    XML与JSON解析示例

    苹果自带的XML解析与JSON序列化类的使用。

    关于XML解析文档

    关于XML解析开发,您可以通过它了解关于XML的相关知识内容,同时可以下载下来

    解析xml中的java包

    标准Dom、JDom(为Java提供的解析技术)、Dom4j(优化之后的解析技术)、SAX(大型xml解析的技术) 树模型:DOM、JDOM、Dom4j; 特点:算法丰富、操作比较简单;一次性读取所有内容到内存(不适于大型xml文件解析...

    JDOM解析xml文档实例(自己编写,仅供参考)

    使用JDM技术解析XML文档,在了解此程序前请到JDOM官网下载一个JDOM的类包,然后配置环境变量或者将类包连接到eclipse路径中,此程序完全可以运行,在压缩包中还包括原xml文档!!!请参考!

    开源XML解析包dom4j

    DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义: Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections ...

    XML解析包.zip krf

    这是XML文件使用的一些资源包 一下是文心一言解释: XML,全称为可扩展标记语言(EXtensible Markup Language),是...以上信息仅供参考,如需了解更多关于XML的信息,建议咨询计算机领域专业人士或查阅相关书籍资料。

    jsp操作xml源码,解析器为DOM和SAX

    利用JSP直接读写XML文件,分别用DOM解析器和SAX解析器加以实现,非常适合初学者入门,作为一个了解jsp与XML的台阶

    解析xml的方式

    解析XML的方式和具体操作方式,了解xml的具体属性,解析xml的具体步骤

    Android 从网络上获取天气XML文档的方法.rar

    本源码中,你将会了解到从网络上获取图片数据的方法、获取天气XML文档的方法、翻译风速字符串的方法、翻译当前风向字符串的方法、翻译天气情况字符串的方法、获取选中城市的汉语拼音、切换到天气明细View、设置当前...

    r语言解析XML文件(XML包初体验)

    r语言解析xml的一个例子 主要用于了解xml包的一些数据类型和特性,对于初次接触r语言xml包的人有一定的帮助作用,只适合初学者哦

    解析dotnet xml

    XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了。...其次,我还会给出有关的实例以使读者更进一步的了解XML文档的读写操作的具体方法。

    JSON解析和XML解析区别对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大。本文系统的分析两种解析方式的区别,为更好地处理数据作准备。由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和XML解析均是在...

    day023-xml解析笔记和代码.rar

    不同的语言都支持XML解析(将XML转换为对应语言中的数据) 1. 数据交换格式(一般不用了,用json代替了) 2. 配置文件都使用XML格式,框架都是用xml和Properties作为配置文件。 1.3. 使用:(掌握...

    使用dom4j解析XML

    我们解析XML,可以把GetIdFromXml.java当成一个工具来用,大概了解其代码就可以使用了,那么怎么使用呢?当然从源码讲起来, setid.xml的代码如下

    c++中用TINYXML解析XML文件

    主要介绍了c++中如何用TINYXML解析XML文件,文中案例非常详细,帮助大家更好的了解和学习,感兴趣的朋友可以了解下

    解析XML操作

    通过该软件,可以掌握解析XML的方法,了解XML的使用

    自己实现一个简单的JSON解析器

    所以作为开发人员,如果有兴趣的话,还是应该深入了解一下 JSON 相关的知识。本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感...

    安卓三种对XML的解析方式

    可以参考一下安卓对XML的解析,多了解无妨

Global site tag (gtag.js) - Google Analytics