﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-thisliy-随笔分类-xml</title><link>http://www.blogjava.net/thisliy/category/39255.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 06 Jun 2009 18:56:22 GMT</lastBuildDate><pubDate>Sat, 06 Jun 2009 18:56:22 GMT</pubDate><ttl>60</ttl><item><title>XML的四种解析器原理及性能比较</title><link>http://www.blogjava.net/thisliy/archive/2009/06/06/280335.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Sat, 06 Jun 2009 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/06/06/280335.html</guid><description><![CDATA[<span style="font-size: 8pt;"><span style="font-size: 14pt;"><span style="font-size: 8pt;"><span><span style="font-size: 8pt;"><span style="font-size: 8pt;"><span style="font-size: 10pt;">1: DOM<br />
<br />
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM
是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何
工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。<br />
<br />
首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。<br />
<br />
另一方面，对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如 SAX。<br />
<br />
2:SAX<br />
<br />
<strong>参考用法：http://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html</strong><br />
<br />
这种处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数
据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX
还比它的替代者 DOM 快许多。<br />
<br />
3:选择 DOM 还是选择 SAX ？<br />
<br />
对于需要自己编写代码来处理 XML 文档的开发人员来说，选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。 <br />
<br />
DOM 采用建立树形结构的方式访问 XML 文档，而 SAX 采用的事件模型。 <br />
<br />
DOM 解析器把 XML 文档转化为一个包含其内容的树，并可以对树进行遍历。用 DOM
解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation
APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML
文档，所以对性能和内存的要求比较高，尤其是遇到很大的 XML 文件的时候。由于它的遍历能力，DOM 解析器常用于 XML
文档需要频繁的改变的服务中。 <br />
<br />
SAX 解析器采用了基于事件的模型，它在解析 XML
文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX
对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX
这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。
<p>　　4:JDOM<br />
<br />
JDOM的目的是成为 Java 特定文档模型，它简化与 XML 的交互并且比使用 DOM
实现更快。由于是第一个 Java 特定模型，JDOM 一直得到大力推广和促进。正在考虑通过&#8220;Java 规范请求
JSR-102&#8221;将它最终用作&#8220;Java 标准扩展&#8221;。从 2000 年初就已经开始了 JDOM 开发。<br />
<br />
JDOM 与 DOM 主要有两方面不同。首先，JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API，但是也限制了灵活性。第二，API 大量使用了 Collections 类，简化了那些已经熟悉这些类的 Java 开发者的使用。<br />
<br />
JDOM 文档声明其目的是&#8220;使用 20%（或更少）的精力解决 80%（或更多）Java/XML 问题&#8221;（根据学习曲线假定为
20%）。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的，并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM
还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而，它仍需要您充分理解 XML
以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。<br />
<br />
JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档（尽管它还可以将以前构造的 DOM
表示作为输入）。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache
许可证变体下发布的开放源码。<br />
<br />
5: DOM4J<br />
<br />
虽然 DOM4J 代表了完全独立的开发结果，但最初，它是
JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能，包括集成的 XPath 支持、XML Schema
支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过 DOM4J API 和标准 DOM
接口具有并行访问功能。从 2000 下半年开始，它就一直处于开发之中。<br />
<br />
为支持所有这些功能，DOM4J
使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections
类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然 DOM4J 付出了更复杂的 API
的代价，但是它提供了比 JDOM 大得多的灵活性。<br />
<br />
在添加灵活性、XPath 集成和对大文档处理的目标时，DOM4J
的目标与 JDOM 是一样的：针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案，实现在本质上处理所有
Java/XML 问题的目标。在完成该目标时，它比 JDOM 更少强调防止不正确的应用程序行为。<br />
<br />
DOM4J
是一个非常非常优秀的Java XML
API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用
DOM4J 来读写 XML，特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。<br />
<br />
6:总述<br />
<br />
JDOM 和 DOM 在性能测试时表现不佳，在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM
的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM 仍是一个非常好的选择。DOM
实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础，因为它正式获得 W3C 推荐（与基于非标准的 Java
模型相对），所以在某些类型的项目中可能也需要它（如在 javascript 中使用 DOM）。<br />
<br />
SAX表现较好，这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。<br />
<br />
无疑，DOM4J是最好的，目前许多开源项目中大量采用 DOM4J，例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性，那就采用DOM4J吧！</p>
</span></span></span></span></span></span></span>
<img src ="http://www.blogjava.net/thisliy/aggbug/280335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-06-06 12:47 <a href="http://www.blogjava.net/thisliy/archive/2009/06/06/280335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML及其作用、CSS、XSL、XSLT、DOM、SAX的概念，XML Schema、XPath </title><link>http://www.blogjava.net/thisliy/archive/2009/04/28/267954.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Tue, 28 Apr 2009 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/04/28/267954.html</guid><description><![CDATA[<pre><span style="font-family: 幼圆;"></span>1、什么是XML？</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: yellow;">Extensible Markup Language，即<span style="color: #0000ff;"><strong>可扩展性标记语言</strong></span>。</span><font color="#000000" size="3" face="Times New Roman">标<br />
记是指计算机所能理解的信息符号，通过此种标记，计算机之间可以处理包含各种信息的文章等。如何定义这些标记，既可以选择国际通用的标记语言，比如<br />
HTML，也可以使用象XML这样由相关人士自由决定的标记语言，这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、<br />
XSL和XPath等</font>。</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;">理解：汉语中的成语，汉语就是前人定<br />
义的XML，成语就是后人创造的新标记，只要明白这个标记，其它人就能使用，并且他人也能理解。可想而知XML只定义了规则，没有限制内容，这点可以通过<br />
对比HTML发现，在HTML中所有的标记都是事先定义好的，是不可以增加的。正如作者所言，<span style="background-color: yellow;">XML是设计语言的语言。</span></span></pre>
<pre><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: yellow;">&nbsp;&nbsp;XML文件也是一个文本文件，重要的一点就是他可以<span style="color: #0000ff;">做为字符串进行传递</span>（好呀）</span></span></pre>
<pre><span style="color: red;"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTML：即超文本标记语言。它是用于创建可从一个平台移植到另一平台的超文本文档的一种简单标记语言，经常用来创建Web页面。HTML文件是带有格式标识符和超文本链接的内嵌代码的文本文件</font></span></pre>
<pre><br />
<br />
2、优越性及作用</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)异质系统中的信息互通（交换）。异质系统再不用关心对方使用什么方式存储数据，什么操作系统，只需要使用XML作为中介格式即可。XML可以很方便的将现有的关系型数据库二维形式转换为XML格式。&nbsp;</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)简单易于保存，谁能想像WORD这样的文档在50年还能打开？谁愿意将自己的所有文档在每次WORD编辑软件升级时更新一次？（还不定会少这少那的）。XML文本文件？简单呀。没这问题啦。 </pre>
<pre><br />
<br />
3、XML标签(tags)或简单语法</pre>
<pre>（1）声明，如&lt;?xml version="1.0" encoding="gb2312"?&gt;；在此声明了xml版本号，使用的字符集。</pre>
<pre>（2）元素(elements )，最高层的元素叫根元素(Root Element)或叫文档元素(Document Element)；每个XML必需且仅拥有一个要元素。元素可分为简单元素和组合元素（拥有下级元素）。</pre>
<pre>（3）元素下可以包含属性(Attributes)</pre>
<pre><img style="width: 522px; height: 142px;" src="http://images.cnblogs.com/cnblogs_com/zhouxihong/XML%E5%AD%A6%E4%B9%A0/XMLelementsAndattributes.GIF" alt="" align="center" width="428" height="215" hspace="5" />&nbsp;</pre>
<pre><br />
<br />
</pre>
<pre>4、什么是CSS（Cascading Style Sheet）层叠式样式单？</pre>
<pre>通用标志语言描述结构，而不是格式；而样式单就是在不破坏文档结构的同时，增加显示格式。</pre>
<pre><br />
<br />
5、什么是XSL？与CSS有什么关系？与XSLT有什么关系？</pre>
<pre>CSS的替代品XSL(Extensible Stylesheet Language)可扩展的样式单语言；将XML通过XSL子集XSLT(XML转换)可按任意格式重现输出（比如：HTML)文档</pre>
<pre><br />
<br />
6、什么是DOM?</pre>
<pre>文档对象模型(Document Object Model)，它是由W3C标准化处理XML的API。并且在Microsoft IE里面已经实现了此API。</pre>
<pre><br />
<br />
7、什么是SAX?DOM与SAX有什么区别?</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Simape API For XML（XML简单API）。</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
DOM与SAX的区别,可以看看这个实例：一个５００Ｍ的ＸＭＬ位于Internet另一端，此时如果使用ＤＯＭ在最终获得数据之前，只有等待，再等待，<br />
它将填充计算机内存及硬盘空间，最终占据所有空间，系统崩溃。；ＳＡＸ则不同，它采用向前的模式，逐步获取数据,且可以随时终止;</pre>
<pre><br />
<br />
</pre>
<pre>8、什么是XML Schema</pre>
<pre>The set of statements, expressed in data definition language, that completely describe the structure of a data base.</pre>
<pre>一组以数据定义语言来表达的语句集,该语句集完整地描述了<span style="color: red;">数据库的结构</span>。</pre>
<pre><br />
<br />
相当于数据表结构定义，包括主键、自定义类型、缺省值等</pre>
<pre><br />
<br />
9、什么是ＸＰＡＴＨ</pre>
<pre>XML Path Lanager是一种ＸＭＬ标记，用于查询和过滤ＸＭＬ文档中的文本。</pre>
<img src ="http://www.blogjava.net/thisliy/aggbug/267954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-04-28 17:38 <a href="http://www.blogjava.net/thisliy/archive/2009/04/28/267954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Java中使用DOM和XPath进行有效的XML处理</title><link>http://www.blogjava.net/thisliy/archive/2009/04/28/267950.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Tue, 28 Apr 2009 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/04/28/267950.html</guid><description><![CDATA[<span style="font-family: 方正姚体;">
<dl><dt>
<pre>文档对象模型(Document Object Model，DOM)是公认的 W3C 标准，它被用于与平台及语言无关的 XML<br />
文档内容、结构和样式的动态访问和更新。它为表示文档定义了一套标准的接口集，也为访问和操纵文档定义了一套标准的方法。DOM<br />
得到广泛的支持和普及，并且它以各种不同的语言实现，包括 Java、Perl、C、C++、VB、Tcl 和 Python.<br />
</pre>
</dt><dt>
<pre>　　正如我将在本文所演示的，当基于流的模型(例如 SAX)不能满足 XML 处理要求时，DOM<br />
是一个极佳的选择。不幸的是，规范的几个方面，例如其语言无关性接口和&#8220;一切都是节点(everything-is-a-node)&#8221;抽象概念的使用，使<br />
其难以使用且易于生成脆弱代码。这在最近的几个大型 DOM<br />
项目的研究中尤其明显，这些项目是由许多开发人员过去一年所创建的。下面讨论了常见的问题及其补救措施。</pre>
</dt><dt>
<pre>　　文档对象模型</pre>
</dt><dt>
<pre>　　DOM 规范被设计成可与任何编程语言一起使用。因此，它尝试使用在所有语言中都可用的一组通用的、核心的功能部件。DOM<br />
规范同样尝试保持其接口定义方面的无关性。这就允许 Java 程序员在使用 Visual Basic 或 Perl 时应用他们的 DOM<br />
知识，反之亦然。</pre>
</dt><dt>
<pre>　　该规范同样将文档的每个部分看成由类型和值组成的节点。这为处理文档的所有方面提供了完美的概念性框架。例如，下面的 XML 片段</pre>
</dt><dt>
<pre>　　the Italicized portion.</pre>
</dt><dt>
<pre>　　就是通过以下的 DOM 结构表示的：</pre>
</dt><dt>
<pre>　　图 1：XML 文档的 DOM 表示</pre>
</dt><dt><center><img src="http://www.soft6.com/upload/news/13/130685/1506000002s.jpeg" alt="" /></center></dt><dt>
<pre>　　树的每个Document 、 Element 、 Text 和 Attr 部分都是 DOM Node 。</pre>
</dt><dt>
<pre>　　完美的抽象确实付出了代价。考虑 XML 片段： Value 。您或许会认为文本的值可以通过普通的 Java String<br />
对象来表示，并且通过简单的 getValue 调用可访问。实际上，文本被当成 tagname 节点下的一个或多个子 Node<br />
。因此，为了获取文本值，您需要遍历 tagname 的子节点，将每个值整理成一个字符串。这样做有充分的理由： tagname<br />
可能包含其它嵌入的 XML 元素，在这种情况下获取其文本值没有多大意义。然而，在现实世界中，我们看到由于缺乏便利的函数导致频繁的编码错误占了<br />
80% 的情况，这样做的确有意义。</pre>
</dt><dt>
<pre>　　设计问题</pre>
</dt><dt>
<pre>　　DOM 语言无关性的缺点是通常在每个编程语言中使用的一整套工作方法和模式不能被使用。例如，不能使用熟悉的 Java new<br />
构造创建新的 Element ，开发者必须使用工厂构造器方法。 Node 的集合被表示成 NodeList ，而不是通常的 List 或<br />
Iterator 对象。这些微小的不便意味着不同寻常的编码实践和增多的代码行，并且它们迫使程序员学习 DOM 的行事方法而不是用直觉的方法。</pre>
</dt><dt>
<pre>　　DOM 使用&#8220;一切都是节点&#8221;的抽象。这就意味着几乎 XML 文档的每个部分，例如： Document 、 Element 和<br />
Attr ，全都继承( extend ) Node 接口。这不仅是概念上完美，而且还允许每个 DOM<br />
的不同实现通过标准接口使其自身的类可见，并且没有通过中间包装类所导致的性能损失。</pre>
</dt><dt>
<pre>　　由于存在的节点类型数量及其访问方法缺乏一致性，&#8220;一切都是节点&#8221;的抽象丧失了一些意义。例如， insertData 方法被用来设置<br />
CharacterData 节点的值，而通过使用 setValue 方法来设置 Attr<br />
(属性)节点的值。由于对于不同的节点存在不同的接口，模型的一致性和完美性降低了，而学习曲线增加了。</pre>
</dt><dt>
<pre>　　JDOM</pre>
</dt><dt>
<pre>　　JDOM 是使 DOM API 适应 Java 的研究计划，从而提供了更自然和易用的接口。由于认识到语言无关 DOM 构造的棘手本质，JDOM 目标在于使用内嵌的 Java 表示和对象，并且为常用任务提供便利的函数。</pre>
</dt><dt>
<pre>　　例如，JDOM 直接处理&#8220;一切都是节点&#8221;和 DOM 特定构造的使用(如 NodeList )。JDOM 将不同的节点类型(如<br />
Document 、 Element 和 Attribute )定义为不同的 Java 类，这意味着开发者可以使用 new<br />
构造它们，避免频繁类型转换的需要。JDOM 将字符串表示成 Java String ，并且通过普通的 List 和 Iterator<br />
类来表示节点的集合。(JDOM 用其本身类替代 DOM 类。)</pre>
</dt><dt>
<pre>　　JDOM 为提供更完善的接口做了相当有益的工作。它已经被接受成为 JSR(正式的 Java Specification<br />
Request)，而且它将来很可能会被包含到核心的 Java 平台中。但是，因其还不是核心 Java API<br />
的一部分，一些人对于使用它还心存犹豫。这儿还有关于与 Iterator 和 Java 对象频繁创建相关的性能问题的报告。(请参阅 参考资料)。</pre>
</dt><dt>
<pre>　　如果您对 JDOM 的接受性和可用性已经满足，并且如果您也没有将 Java 代码和程序员转移到其它语言的直接需求，JDOM 是个值得探索的好选择。JDOM 还不能满足本文探讨的项目所在的公司需要，因而他们使用了非常普遍的 DOM。本文也是这样做的。</pre>
</dt><dt>
<pre>　　常见编码问题</pre>
</dt><dt>
<pre>　　几个大型 XML 项目分析揭示了使用 DOM 中的一些常见问题。下面对其中的几个进行介绍。</pre>
</dt><dt>
<pre>　　代码臃肿</pre>
</dt><dt>
<pre>　　在我们研究中查看的所有项目，本身都出现一个突出的问题：花费许多行代码行来做简单的事情。在某个示例中，使用 16<br />
行代码检查一个属性的值。而同样的任务，带有改进的健壮性和出错处理，可以使用 3 行代码实现。DOM API<br />
的低级本质、方法和编程模式的不正确应用以及缺乏完整 API 的知识，都会致使代码行数增加。下面的摘要介绍了关于这些问题的特定实例。</pre>
</dt><dt>
<pre>　　遍历 DOM</pre>
</dt><dt>
<pre>　　在我们探讨的代码中，最常见的任务是遍历或搜索 DOM。 清单 1 演示了需要在文档的 config 节里查找一个称为&#8220;header&#8221;节点的浓缩版本代码：</pre>
</dt><dt>
<pre>　　清单 1 中，从根开始通过检索顶端元素遍历文档，获取其第一个子节点( configNode )，并且最终单独检查 configNode 的子节点。不幸的是，这种方法不仅冗长，而且还伴随着脆弱性和潜在的错误。</pre>
</dt><dt>
<pre>　　例如，第二行代码通过使用 getFirstChild 方法获取中间的 config<br />
节点。已经存在许多潜在的问题。根节点的第一个子节点实际上可能并不是用户正在搜索的节点。由于盲目地跟随第一个子节点，我忽视了标记的实际名称并且可能<br />
搜索不正确的文档部分。当源 XML 文档的根节点后包含空格或回车时，这种情况中发生一个频繁的错误;根节点的第一个子节点实际是<br />
Node.TEXT_NODE 节点，而不是所希望的元素节点。您可以自己试验一下，从 参考资料下载样本代码并且编辑 sample.xml 文件<br />
― 在 sample 和 config 标记之间放置一个回车。代码立即异常而终止。要正确浏览所希望的节点，需要检查每个 root<br />
的子节点，直到找到非 Text 的节点，并且那个节点有我正在查找的名称为止。</pre>
</dt><dt>
<pre>　　清单 1 还忽视了文档结构可能与我们期望有所不同的可能性。例如，如果 root 没有任何子节点， configNode 将会被设置为<br />
null<br />
，并且示例的第三行将产生一个错误。因此，要正确浏览文档，不仅要单独检查每个子节点以及核对相应的名称，而且每步都得检查以确保每个方法调用返回的是一<br />
个有效值。编写能够处理任意输入的健壮、无错的代码，不仅需要非常关注细节，而且需要编写很多行代码。</pre>
</dt><dt>
<pre>　　最终，如果最初的开发者了解它的话，清单 1 中示例的所有功能应该可以通过利用对 getElementsByTagName 函数的简单调用实现。这是下面要讨论的。</pre>
</dt><dt>
<pre>　　检索元素中的文本值</pre>
</dt><dt>
<pre>　　在所分析的项目中，DOM 遍历以后，第二项最常进行的任务是检索在元素中包含的文本值。考虑 XML 片段 The Value 。如果已经导航到 sometag 节点，如何获取其文本值( The Value )呢?一个直观的实现可能是：</pre>
</dt><dt>
<pre>　　sometagElement.getData();</pre>
</dt><dt>
<pre>　　正如您所猜测到的，上面的代码并不会执行我们希望的动作。由于实际的文本被存储为一个或多个子节点，因此不能对 sometag 元素调用 getData 或类似的函数。更好的方法可能是：</pre>
</dt><dt>
<pre>　　sometag.getFirstChild().getData();</pre>
</dt><dt>
<pre>　　第二种尝试的问题在于值实际上可能并不包含在第一个子节点中;在 sometag<br />
内可能会发现处理指令或其它嵌入的节点，或是文本值包含在几个子节点而不是单单一个子节点中。考虑到空格经常作为文本节点表示，因此对<br />
sometag.getFirstChild() 的调用可能仅让您得到标记和值之间的回车。实际上，您需要遍历所有子节点，以核对<br />
Node.TEXT_NODE 类型的节点，并且整理它们的值直到有完整的值为止。</pre>
</dt><dt>
<pre>　　注意，JDOM 已经利用便利的函数 getText 为我们解决了这个问题。DOM 级别 3 也将有一个使用规划的 getTextContent 方法的解答。教训：尽可能使用较高级的 API 是不会错的。</pre>
</dt><dt>
<pre>　　getElementsByTagName</pre>
</dt><dt>
<pre>　　DOM 级别 2 接口包含一个查找给定名称的子节点的方法。例如，调用：</pre>
</dt><dt>
<pre>　　NodeList names = someElement.getElementsByTagName("name");</pre>
</dt><dt>
<pre>　　将返回一个包含在 someElement 节点中称为 names 的节点 NodeList 。这无疑比我所讨论的遍历方法更方便。这也是一组常见错误的原因。</pre>
</dt><dt>
<pre>　　问题在于 getElementsByTagName<br />
递归地遍历文档，从而返回所有匹配的节点。假定您有一个包含客户信息、公司信息和产品信息的文档。所有这三个项中都可能含有 name 标记。如果调用<br />
getElementsByTagName<br />
搜索客户名称，您的程序极有可能行为失常，除了检索出客户名称，还会检索出产品和公司名称。在文档的子树上调用该函数可能会降低风险，但由于 XML<br />
的灵活本质，使确保您所操作的子树包含您期望的结构，且没有您正在搜索的名称的虚假子节点就变得十分困难。</pre>
</dt><dt>
<pre>　　DOM 的有效使用</pre>
</dt><dt>
<pre>　　考虑到由 DOM 设计强加的限制，如何才能有效和高效的使用该规范呢?下面是使用 DOM 的几条基本原则和方针，以及使工作更方便的函数库。</pre>
</dt><dt>
<pre>　　基本原则</pre>
</dt><dt>
<pre>　　如果您遵循几条基本原则，您使用 DOM 的经验将会显著提高：</pre>
</dt><dt>
<pre>　　◆ 不要使用 DOM 遍历文档。</pre>
</dt><dt>
<pre>　　◆ 尽可能使用 XPath 来查找节点或遍历文档。</pre>
</dt><dt>
<pre>　　◆ 使用较高级的函数库来更方便地使用 DOM。</pre>
</dt><dt>
<pre>　　这些原则直接从对常见问题的研究中得到。正如上面所讨论的，DOM 遍历是出错的主要原因。但它也是最常需要的功能之一。如何通过不使用 DOM 而遍历文档呢?</pre>
</dt><dt>
<pre>　　Path</pre>
</dt><dt>
<pre>　　XPath 是寻址、搜索和匹配文档的各个部分的语言。它是 W3C 推荐标准(Recommendation)，并且在大多数语言和<br />
XML 包中实现。您的 DOM 包可能直接支持 XPath 或通过加载件(add-on)支持。本文的样本代码对于 XPath 支持使用<br />
Xalan 包。</pre>
</dt><dt>
<pre>　　XPath 使用路径标记法来指定和匹配文档的各个部分，该标记法与文件系统和 URL 中使用的类似。例如，XPath: /x/y/z 搜索文档的根节点 x ，其下存在节点 y ，其下存在节点 z 。该语句返回与指定路径结构匹配的所有节点。</pre>
</dt><dt>
<pre>　　更为复杂的匹配可能同时在包含文档的结构方面以及在节点及其属性的值中。语句 /x/y/* 返回父节点为 x 的 y 节点下的任何节点。<br />
/x/y[@name=''a''] 匹配所有父节点为 x 的 y 节点，其属性称为 name ，属性值为 a 。请注意，XPath<br />
处理筛选空格文本节点以获得实际的元素节点 ― 它只返回元素节点。</pre>
</dt><dt>
<pre>　　详细探讨 XPath 及其用法超出了本文的范围。请参阅 参考资料获得一些优秀教程的链接。花点时间学习 XPath，您将会更方便的处理 XML 文档。</pre>
</dt><dt>
<pre>　　函数库</pre>
</dt><dt>
<pre>　　当研究 DOM<br />
项目时令我们惊奇的一个发现，是存在的拷贝和粘贴代码的数量。为什么有经验的开发者没有使用良好的编程习惯，却使用拷贝和粘贴方法而不是创建助手<br />
(helper)库呢?我们相信这是由于 DOM<br />
的复杂性加深了学习的难度，并使开发者要理解能完成他们所需要的第一段代码。开发产生构成助手库规范的函数所需的专门技术需要花费大量的时间。</pre>
</dt><dt>
<pre>　　要节省一些走弯路的时间，这里是一些将使您自己的库可以运转起来的基本助手函数。</pre>
</dt><dt>
<pre>　　findValue</pre>
</dt><dt>
<pre>　　使用 XML<br />
文档时，最常执行的操作是查找给定节点的值。正如上所讨论的，在遍历文档以查找期望的值和检索节点的值中都出现难度。可以通过使用 XPath<br />
来简化遍历，而值的检索可以一次编码然后重用。在两个较低级函数的帮助下，我们实现了 getValue 函数，这两个低级函数是：由 Xalan<br />
包提供的 XPathAPI.selectSingleNode (用来查找和返回与给定的 XPath 表达式匹配的第一个节点);以及<br />
getTextContents ，它非递归地返回包含在节点中的连续文本值。请注意，JDOM 的 getText 函数，或将出现在 DOM 级别<br />
3 中规划的 getTextContent 方法，都可用来代替 getTextContents 。 清单<br />
2包含了一个简化的清单;您可以通过下载样本代码来访问所有函数(请参阅 参考资料)。</pre>
</dt><dt>
<pre>　　通过同时传入要开始搜索的节点和指定要搜索节点的 XPath 语句来调用 findValue 。函数查找第一个与给定 XPath 匹配的节点，并且抽取其文本值。</pre>
</dt><dt>
<pre>　　setValue</pre>
</dt><dt>
<pre>　　另一项常用的操作是将节点的值设置为希望的值，如 清单 3 所示。该函数获取一个起始节点和一条 XPath 语句 ― 就象<br />
findValue ―<br />
以及一个用来设置匹配的节点值的字符串。它查找希望的节点，除去其所有子节点(因此除去包含在其中的任何文本和其它元素)，并将其文本内容设置为传入的<br />
(passed-in)字符串。</pre>
</dt><dt>
<pre>　　appendNode</pre>
</dt><dt>
<pre>　　虽然某些程序查找和修改包含在 XML 文档中的值，而另一些则通过添加和除去节点来修改文档本身的结构。这个助手函数简化了文档节点的添加，如 清单 4所示。</pre>
</dt><dt>
<pre>　　该函数的参数有：要将新节点添加到其下的节点，要添加的新节点名称，以及指定要将节点添加到其下位置的 XPath 语句(也就是，新节点的父节点应当是哪个)。新节点被添加到文档的指定位置。</pre>
</dt><dt>
<pre>　　最终分析</pre>
</dt><dt>
<pre>　　DOM 的语言无关性设计为其带来了非常广泛的可应用性并使其在大量的系统和平台上得以实现。这样做的代价是：使 DOM 比为每个语言专门设计的 API 更困难且更缺乏直观性。</pre>
</dt><dt>
<pre>　　DOM 奠定了一个非常有效的基础，遵循一些简单的原则就可其上构建易于使用的系统。凝结了一大群用户智慧和经验的 DOM<br />
未来版本正在设计之中，而且极有可能为这里讨论的问题提供解决方案。如 JDOM 这样的项目正在修改该 API 以获得更自然 Java<br />
感觉，而且如本文中所述的技术可以帮助您使 XML 的操纵更方便、更简洁并且不易出错。利用这些项目且遵循这些用法模式以允许 DOM 成为基于<br />
XML 项目的出色平台。</pre>
</dt></dl>
</span>
<img src ="http://www.blogjava.net/thisliy/aggbug/267950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-04-28 17:27 <a href="http://www.blogjava.net/thisliy/archive/2009/04/28/267950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>