|
技巧:使用基于拉的DOM-- 在容易和高效的编程之间找到平衡点广告 技巧:使用基于拉的DOM Uche Ogbuji(uche.ogbuji@fourthought.com) XML 应用程序开发人员经常必须应付 SAX 的复杂性或 DOM 的低效率。这篇技巧文章展示了 DOM
的拉方法是如何通过提供简单、高效的解析来高效地跨过这两者之间的鸿沟。 为了赋予开发人员 DOM 的容易和 SAX 的效率,有许多项目着重于各种仅在请求 XML 文档某部分时才将其装入的 DOM。这些 API 称为拉 DOM(pull DOM)。 解析还是不解析…… 清单 1:打印“哈姆雷特”第 IV 幕第 II
场的第一行 首先,描述一下 hamlet.xml 的大概结构。顶级元素是 PLAY,它包含了许多 ACT 元素和其它元素,ACT 元素又包含了许多 SCENE 元素。SCENE 包含 SPEECH,而 SPEECH 又包含一组 LINE,每个 LINE 由一个演员来讲。这是一个相当简单的层次结构。 在第 3 行中导入库以后,我在第 5 行中打开了 XML 文件并对其解析进行了初始化。pulldom 解析返回一个对象,该对象表示来自该文件的所有解析事件的虚集合。在 9-23 行中,我在这个集合上进行了循环。循环中的每次迭代取回一个事件和一个虚节点,它潜在地表示以该虚节点为根的整个子树。您可以检查它是什么类型的事件 — 含蓄地说,是什么类型的节点 — 以及该节点表面的一些东西,如节点名称。如果您想要关于其子节点的信息,可以等待适当的后续事件或使用 expandNode 方法将该节点展开成其完整的实际 DOM 树。 在第 10 行,我检查当前事件是否元素的开始,这是我在该程序的拉部分关心的唯一事件类型。如果它是 ACT 元素(在第 11 行检查),则我更新此类元素的计数器(在第 8 行初始化),并使 SCENE 元素计数器复位。如果它是 SCENE 元素(在第 14 行检查),则我检查它是否我想要的幕和场号,如果不是,则更新计数器。 如果是我想要的那一幕,则我将如上面所提到的那样,用 expandNode 将该幕的整个 DOM 结构拉到内存中。从此时开始,该节点是常规 DOM 节点,您可以在节点上调用常规 DOM 方法。在第 19 行中,我使用 getElementsByTagName DOM 方法来获得所有名为 LINE 的子孙元素。理解这一点很重要:如果我在第 16 行之前调用了该方法,它将导致一个错误;这是因为,在展开节点之前,没有真正的 DOM 树。理解这一点也很重要:您选择在哪个节点上进行展开决定了产生的效率。如果我选择了展开整个 ACT 而不是 SCENE,则所有其它 SCENE 也都被装进内存。 最后,在抓取了第一个 LINE 元素之后,我在第 22 行中搜寻其文本子节点,并打印其内容。任务完成。 用您熟悉的语言就可以使用拉 DOM Java 社区过程正试图标准化 Java 的拉 API;The Streaming API for XML(StAX),in JSR 173 Streaming API for XML。 XML::Twig 是用于基于拉处理的 Perl 模块,但它不是基于 DOM 的。 这里当然有 Python 的 pulldom 模块,本文中用的就是它。 这里是由 Jon Bosak 用 XML 标记的莎士比亚戏剧全集目录(包括“哈姆雷特”)。 IBM WebSphere Studio Site Developer 是一种易于使用的、集成的开发环境,用于构建、测试和部署 Java Server Pages、servlet 和 XML 相关的应用程序以及网站。 看看您如何才能成为 XML 和相关技术的 IBM 认证开发人员(Certified Developer)。 想要我们每周都给您发送象这样有用的 XML 技巧文章吗?从这里订阅 developerWorks XML 技巧文章时事通讯。 在 developerWorks XML 专区上有更多的 XML 参考资料。
如果您希望与本文章的作者或其所在机构,进一步交流,请联系:畅享网 姜小姐 jill.jiang@amt.com.cn | 021-51096826-112 | 在线联系 |
CIO职场,强者生存?在2008年,我们将继续看到CIO向商业运营方向发展。与此同时,我们也会看到商业管理人员将与技术管理人员一起竞争CIO岗位。 IT领导者的就职机会虽有不少,但其难度将会大幅提高。2…… 防震减灾,IT当关今天,任何的防震救灾体系,都离不开IT技术。地震观测台是数字化的,震害防御需要对以往的地震信息进行数据分析,应急救援要需要现代多样化的通讯技术。如果说,在许多行业,信息技术还只是一…… |
|
|