`
gq913
  • 浏览: 167029 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

XML基础

    博客分类:
  • JAVA
阅读更多

XML篇

 

   说XML这块的东西倒不是因为研究的比较深入,只是因为项目里面使用的XML太频繁了,不过只是相当简单的使用,所以在这里只能算是一个对XML技术的相关资料的总结、备忘。


XML解析标准
    这里说可能不太熟悉,但是如果换几个词就应该清楚。DOM、SAX。比较熟悉吧。这里之所以说他们是标准,只因为这两个东西定义的只是XML解析的方式,而此方式的具体实现跟这两个东西是没有关系。对比一下写程序,这里就是“接口”,定义了规约,想怎么实现都是可以的。

    --DOM(Document Object Model):文档对象模型。原理就是把XML解析为内存中的可以树。由于XML保存在内存中了,所以,可以对其进行相应的增、删、改、查,操作。这里就需要说一下XPath了,XPath 为在一颗树中查找XML内容的方式定义。也是一个标准的东西,你满足了其相应的语法,即可在DOM树中查找到相应的内容。使用起了还是相当方便的。

     --SAX(Simple API for XML) : 以事件驱动的解析方式,所谓的“推”方式的XML解析。原理就是在解析XML时,碰到不同的节点,则上报不同的事件,对不同的事件定义不同的回调函数,完成相应的解析逻辑。SAX对XML文档应该就是一次解析,并且不保留解析状态,所以SAX比DOM方式速度会快点、内存使用少点,但是功能上就要弱很多了。
     --StAX(Streaming API for XML):这个东西可能有点陌生。这是所谓的“拉”方式的XML。原理就是平时常见的遍历,即扫描XML文档,当发现我感兴趣的部分时,才开始进行解析。所以,说速度的话,这是三种中最快的一个,而且编写代码也相对简单。它可以多次对同一个文档进行解析。但是相对的,它的缺点也是很明显的,就是无法对XML进行合法性验证,所以即便是不太完整的XML文档,也可以用它完成解析。StAX在JDK6.0中被加入。这里 有篇好文介绍StaX的


    JDK中的位置: 以上标准,JDK中都已经包括相应的接口定义。DOM -- org.w3c.dom; SAX -- org.xml.sax; StAX -- org.xml.stream(JDK6.0)
    更多细节的东西可以参考sun的教程

XML解析器
解析器即为XML解析标准的具体实现。不同的解析器,对应的实现接口都是统一的(DOM的、SAX的、StAX的)。所以不要看见JDOM就认为它只能以DOM方式解析,其实它也支持SAX的。常见的解析器有以下几种:Xerces JavaCrimsonJDOMdom4j。各解析器的具体使用可以参考具体doc即可。
   StAX是一个比较特殊的。JDK6.0刚开始提供支持,所以不是很清楚它的解析器。而基于这种XML Pull方式的解析器,因为速度快、消耗内存小,很早就被用于手机上的XML解析了,比较著名的就是kxml 。有兴趣的大家可以查下看看。


XML解析(绑定)工具
   有了标准、有了实现还不够吗?这个工具干什么使的?标准有了、解析器有了,但是实用性还是差一点,所以,诞生了很多XML解析的工具。它的功能就是,避免你面对解析过程,而是直接面对XML里对你有用的东西。常见的有如下一些:XMLBean ,XStreamCastorJBindQuickZeus


项目中的XML
    项目中我们用到了两处XML解析,分别使用了两个不用的解析器。一个地方使用的是Kxml的解析器,用于把XML压缩过后的文档转换成一般的文本的文档。另一个地方用户的是Zeus,主要是把XML文本文档解析为Java对象。这里主要说下Zeus。把DTD给Zeus,它可以生产能解析对应DTD文档的Java对象;反之,如果你使用这些Java对象把相应的树型XML文档定义构造好,又可用这些Java对象生成相应的XML文档。Zeus使用SAX方式解析的,效率还是相当高的,测评可以参考下面给出的文章。
   目前感觉使用Zeus很麻烦的一点就是“有效信息的获取”。Zeus产生的Java对象是按XML的树型结构组织的,所以如果要获取层次比较深的内容时,会相当麻烦,因为你必须一层一层打开Java对象,而且有些节点定义还可能时List型的,这样又需要遍历List中的所有元素,同时,每次打开一个Java对象以后,还必须判断此Java对象是否为NULL,别看这一点判断,因为对象多了以后,会很麻烦。我们应用中嵌套深一点的可能在7、8层这样子,已经是相当麻烦了。在这种时候你就不得不考虑一下XPath的便捷了。所以,这里是否应该使用Zeus还是值得斟酌一下的。有效信息的获取上是一个相当麻烦的问题。
   木已成舟,该做的都做的差不多,想用XPath也用不了。偏偏在这种时候又让我看到一个工具——JXpth 。这是一个在Java对象树中使用XPath语法进行查找的工具。可惜是相见恨晚啊...这个东西只是大概看了一下,没有具体使用。所以了解不多,是否真正能够放到应用中还是一个问题。
   XML这块还有一个比较大的问题,就是Zeus生成的对象已经被使用到业务部分,造成现在即便想替换掉Zeus也是一个比较大的问题。这块以前也考虑过,但是还是没有想到太好的数据传递的方式,现在暂时也没有什么太大的问题。只是不知道以后会碰到什么,有点担心。


几篇好文
  下面列几篇文章吧,相当的精彩。
  Java 中的 XML: Java 文档模型的用法
  Java 中的 XML: 文档模型,第一部分:性能
  Java 中的 XML: 数据绑定,第 1 部分:代码生成方法 — JAXB 及其它
  Java 中的 XML: 数据绑定,第 2 部分:性能

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics