快速业务通道

在Java中使用DOM和XPath进行有效的XML处理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
e )呢?一个直观的实现可能是:

sometagElement.getData();

正如您所猜测到的,上面的代码并不会执行我们希望的动作。由于实际的文本被存储为一 个或多个子节点,因此不能对 sometag 元素调用 getData 或类似的函数。更好的方法可能 是:

sometag.getFirstChild().getData();

第二种尝试的问题在于值实际上可能并不包含在第一个子节点中;在 sometag 内可能会 发现处理指令或其它嵌入的节点,或是文本值包含在几个子节点而不是单单一个子节点中。 考虑到空格经常作为文本节点表示,因此对 sometag.getFirstChild() 的调用可能仅让您得 到标记和值之间的回车。实际上,您需要遍历所有子节点,以核对 Node.TEXT_NODE 类型的 节点,并且整理它们的值直到有完整的值为止。

注意,JDOM 已经利用便利的函数 getText 为我们解决了这个问题。DOM 级别 3 也将有 一个使用规划的 getTextContent 方法的解答。教训:尽可能使用较高级的 API 是不会错的 。

getElementsByTagName

DOM 级别 2 接口包含一个查找给定名称的子节点的方法。例如,调用:

NodeList names = someElement.getElementsByTagName("name");

将返回一个包含在 someElement 节点中称为 names 的节点 NodeList 。这无疑比我所讨 论的遍历方法更方便。这也是一组常见错误的原因。

问题在于 getElementsByTagName 递归地遍历文档,从而返回所有匹配的节点。假定您有 一个包含客户信息、公司信息和产品信息的文档。所有这三个项中都可能含有 name 标记。 如果调用 getElementsByTagName 搜索客户名称,您的程序极有可能行为失常,除了检索出 客户名称,还会检索出产品和公司名称。在文档的子树上调用该函数可能会降低风险,但由 于 XML 的灵活本质,使确保您所操作的子树包含您期望的结构,且没有您正在搜索的名称的 虚假子节点就变得十分困难。

DOM 的有效使用

考虑到由 DOM 设计强加的限制,如何才能有效和高效的使用该规范呢?下面是使用 DOM 的几条基本原则和方针,以及使工作更方便的函数库。

基本原则

如果您遵循几条基本原则,您使用 DOM 的经验将会显著提高:

不要使用 DOM 遍历文档。

尽可能使用 XPath 来查找节点或遍历文档。

使用较高级的函数库来更方便地使用 DOM。

这些原则直接从对常见问题的研究中得到。正如上面所讨论的,DOM 遍历是出错的主要原 因。但它也是最常需要的功能之一。如何通过不使用 DOM 而遍历文档呢?

在Java中使用DOM和XPath进行有效的XML处理(4)

时间:2011-04-13 IBM Parand Tony Darugar

Path

XPath 是寻址、搜索和匹配文档的各个部分的语言。它是 W3C 推荐标准 (Recommendation),并且在大多数语言和 XML 包中实现。您的 DOM 包可能直接支持 XPath 或通过加载件(add-on)支持。本文的样本代码对于 XPath 支持使用 Xalan 包。

XPath 使用路径标记法来指定和匹配文档的各个部分,该标记法与文件系统和 URL 中使 用的类似。例如,XPath: /x/y/z 搜索文档的根节点 x ,其下存在节点 y ,其下存在节点 z 。该语句返回与指定路径结构匹配的所有节点。

更为复杂的匹配可能同时在包含文档的结构方面以及在节点及其属性的值中。语句 /x/y/* 返回父节点为 x 的 y 节点下的任何节点。 /x/y[@name=''a''] 匹配所有父节点为 x 的 y 节点,其属性称为 name ,属性值为 a 。请注意,XPath 处理筛选空格文本节点以获 得实际的元素节点 ― 它只返回元素节点。

详细探讨 XPath 及其用法超出了本文的范围。请参阅 参考资料获得一些优秀教程的链接 。花点时间学习 XPath,您将会更方便的处理 XML 文档。

函数库

当研究 DOM 项目时令我们惊奇的一个发现,是存在的拷贝和粘贴代码的数量。为什么有 经验的开发者没有使用良好的编程习

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号