﻿<?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-honeybee-文章分类-XML</title><link>http://www.blogjava.net/honeybee/category/27253.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 Nov 2007 00:17:14 GMT</lastBuildDate><pubDate>Tue, 20 Nov 2007 00:17:14 GMT</pubDate><ttl>60</ttl><item><title>XPath入门学习</title><link>http://www.blogjava.net/honeybee/articles/161733.html</link><dc:creator>sun</dc:creator><author>sun</author><pubDate>Mon, 19 Nov 2007 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/honeybee/articles/161733.html</guid><wfw:comment>http://www.blogjava.net/honeybee/comments/161733.html</wfw:comment><comments>http://www.blogjava.net/honeybee/articles/161733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honeybee/comments/commentRss/161733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honeybee/services/trackbacks/161733.html</trackback:ping><description><![CDATA[<h2>&nbsp; </h2>
<h2 style="border-right: medium none; padding-right: 0cm; border-top: medium none; padding-left: 0cm; padding-bottom: 0cm; border-left: medium none; padding-top: 0cm; border-bottom: #dddddd 1pt solid; mso-element: para-border-div"><span style="font-family: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'">简述</span><span lang="EN-US">XPath</span><span style="font-family: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'">，</span><span lang="EN-US">XSLT</span><span style="font-family: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'">，</span><span lang="EN-US">XLink</span><span style="font-family: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'">与</span><span lang="EN-US">XPointer<o:p></o:p></span></h2>
<h2><span lang="EN-US">XSLT</span>、<span lang="EN-US">XLink </span>和<span lang="EN-US"> XPointer </span>都是<span lang="EN-US"> W<st1:chmetcnv w:st="on" unitname="C" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3C</st1:chmetcnv> </span>标准。<span lang="EN-US">XSLT </span>和<span lang="EN-US"> XPath</span>，以及<span lang="EN-US"> XSL Formatting Object (XSL-FO) </span>构成了<span lang="EN-US"> W<st1:chmetcnv w:st="on" unitname="C" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3C</st1:chmetcnv> eXtensible Stylesheet Language (XSL) </span>系列规范。<span lang="EN-US"><o:p></o:p></span></h2>
<p><span lang="EN-US">XSLT</span>、<span lang="EN-US">XLink </span>和<span lang="EN-US"> XPointer </span>都是<span lang="EN-US"> W<st1:chmetcnv w:st="on" unitname="C" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3C</st1:chmetcnv> </span>标准。<span lang="EN-US">XSLT </span>和<span lang="EN-US"> XPath</span>，以及<span lang="EN-US"> XSL Formatting Object (XSL-FO) </span>构成了<span lang="EN-US"> W<st1:chmetcnv w:st="on" unitname="C" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0">3C</st1:chmetcnv> eXtensible Stylesheet Language (XSL) </span>系列规范。<span lang="EN-US"><o:p></o:p></span></p>
<p><span style="color: red">表示：</span><span lang="EN-US">XSLT </span>广泛使用<span lang="EN-US"> XPath </span>进行匹配<span lang="EN-US">――</span>也就是，测试节点是否匹配指定模式。<span lang="EN-US">XSLT </span>指定了<span lang="EN-US"> XPath </span>使用的上下文。如果想使用<span lang="EN-US"> XSLT</span>，就应该了解<span lang="EN-US"> XPath</span>。在 关于本教程中使用的例子 中，您看到了<span lang="EN-US"> AuctionItemSummary-Base.xsl </span>样式表包含了<span lang="EN-US"> XPath </span>表达式。<span lang="EN-US">XSLT </span>使用这些<span lang="EN-US"> XPath </span>表达式，在源文档中查找匹配条件的元素，也使用它们来显示结果文档中的信息。<span lang="EN-US">XSLT </span>使用<span lang="EN-US"> XPath </span>函数来执行算术和字符串操纵操作。<span lang="EN-US"><o:p></o:p></span></p>
<p><span style="color: red">链接：</span><span lang="EN-US">XLink </span>在<span lang="EN-US"> XML </span>中提供了<span lang="EN-US"> HTML </span>超链接概念的一般化。<span lang="EN-US">XLink </span>为要插入<span lang="EN-US"> XML </span>文档的元素提供了某种语法，以便把资源链接在一起，及描述它们的关系。这些链接可以是单向的，比如<span lang="EN-US"> HTML </span>的超链接，或者更加复杂的。<span lang="EN-US">XLink </span>使用<span lang="EN-US"> XPointer </span>来查找资源。<span lang="EN-US"><o:p></o:p></span></p>
<p><span style="color: red">指向：</span><span lang="EN-US">XPointer </span>是<span lang="EN-US"> XPath </span>的扩展，提供了到<span lang="EN-US"> XML </span>文档及其内部的寻址。<span lang="EN-US">XPointer </span>一般化了<span lang="EN-US"> XPath </span>节点的概念，使用了<span lang="EN-US"> XPointer </span>位置、点和范围的概念。<span lang="EN-US">XPointer </span>也指定了在<span lang="EN-US"> XPath </span>计算过程中使用的上下文，并提供了在<span lang="EN-US"> XPath </span>中不可用的其他函数。</p>
<h3><span class="3Char"><span style="font-size: 16pt">一句话小结<span lang="EN-US">:</span></span></span><span lang="EN-US">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XML</span>：其他技术的基础（数据）。<span lang="EN-US">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XML Schema</span>：数据格式规则。<span lang="EN-US">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XSLT</span>：数据表示<span lang="EN-US">/</span>匹配。<span lang="EN-US">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XLink</span>：链接。<span lang="EN-US">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XPointer and XPath</span>：寻址。</h3>
<h2><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></h2>
<h2><span class="2Char"><span lang="EN-US" style="font-size: 12.5pt">XML</span></span><span class="2Char"><span style="font-size: 12.5pt; font-family: 宋体; mso-ascii-font-family: 'Trebuchet MS'; mso-hansi-font-family: 'Trebuchet MS'">语法</span></span><span lang="EN-US"><br />
<br />
</span><span class="3Char"><span style="font-size: 16pt">一<span lang="EN-US">.</span>位置路径</span></span><span lang="EN-US"><br />
1.</span>路径<span lang="EN-US"><br />
</span>位置路径是<span lang="EN-US"> XPath </span>中最有用也是应用最广泛的特性。位置路径是<span lang="EN-US"> XPath </span>表达式的特化（参见 表达式）。位置路径标识了和上下文有关的一组<span lang="EN-US"> XPath </span>节点。<span lang="EN-US">XPath </span>定义了两种语法：简化语法和非简化语法。<span lang="EN-US"><o:p></o:p></span></h2>
<h2>位置路径有相对和绝对两种类型。<span lang="EN-US"><br />
</span>相对位置路径由使用<span lang="EN-US"> / </span>分隔的定位步序列组成。比如：<span lang="EN-US"><br />
list/item[currentPrice&lt;20.0]<o:p></o:p></span></h2>
<h2>绝对位置路径由<span lang="EN-US"> / </span>和后面可选的相对位置路径组成，其中<span lang="EN-US"> / </span>表示根节点。<span lang="EN-US"><br />
/list/item[currentPrice&lt;20.0]<br />
XPath </span>表达式<span lang="EN-US"> /list </span>就确定了一个单独的节点<span lang="EN-US">――list </span>根元素。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">The XPath </span>表达式<span lang="EN-US"> /list/item </span>确定了所有<span lang="EN-US"> item </span>元素。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">XPath </span>表达式可以引用属性及<span lang="EN-US"> XML </span>文档中的元素。当引用属性时，使用<span lang="EN-US"> @ </span>字符。例如，下面的<span lang="EN-US"> XPath </span>表达式确定了<span lang="EN-US"> currentPrice </span>元素，其<span lang="EN-US"> currency </span>属性包含值<span lang="EN-US"> EUR</span>：<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">/list/item/currentPrice[@currency="EUR"]<o:p></o:p></span></h2>
<h2><span lang="EN-US"><br />
@ </span>用于引用属性。比如，位置路径<span lang="EN-US"> @currency </span>标识了<span lang="EN-US"> currency </span>属性。<span lang="EN-US">list/item[@private] </span>标识带有<span lang="EN-US"> private </span>属性的<span lang="EN-US"> item </span>元素，意即<span lang="EN-US"> AuctionItemList.xml </span>中的所有<span lang="EN-US"> item </span>元素。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">* </span>用于引用上下文结点的所有子元素。<span lang="EN-US">@* </span>用于引用上下文结点的所有属性。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">[] </span>也可用于引用有序序列中的特定元素。比如，<span lang="EN-US">list/item[2] </span>代表第二个<span lang="EN-US"> item </span>元素。实际上<span lang="EN-US"> [] </span>是一个谓词（参见谓词）。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">// </span>用于引用上下文节点的所有孩子。比如，<span lang="EN-US">//item </span>表示所有的<span lang="EN-US"> item </span>元素，而<span lang="EN-US"> //list/item </span>引用以<span lang="EN-US"> list </span>为父元素的所有<span lang="EN-US"> item </span>元素（在该例中即所有的<span lang="EN-US"> item </span>元素）。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">. </span>用于引用上下文节点自身。比如，<span lang="EN-US">. </span>选择上下文节点，而<span lang="EN-US"> .//item </span>代表作为上下文节点孩子的所有<span lang="EN-US"> item </span>元素。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">.. </span>用于引用上下文节点的父节点。比如，在第一个<span lang="EN-US">bidIncrement </span>元素的上下文中，<span lang="EN-US"> ../item </span>就表示第一个<span lang="EN-US"> item </span>元素。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">2.</span>谓词<span lang="EN-US"><br />
</span>谓词在位置路径中用于筛选当前节点集。谓词包含一个<span lang="EN-US"> boolean </span>表达式（或者很容易转化成<span lang="EN-US"> boolean </span>值的表达式）。用这个布尔表达式测试当前节点集的每个成员，如果表达式成立则保留该成员否则丢弃。谓词放在方括号<span lang="EN-US">[]</span>中。比如下面的位置路径：<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">list/item/currentPrice[@currency="EUR"]<br />
</span>在计算过程中，<span lang="EN-US">AuctionItemList.xml </span>中所有的<span lang="EN-US"> currentPrice </span>元素都放在选择的节点集中。然后计算谓词<span lang="EN-US"> @currency="EUR"</span>，货币中不包含值<span lang="EN-US"> EUR </span>的<span lang="EN-US"> currentPrice </span>元素被抛弃。<span lang="EN-US"><br />
</span>谓词也可以使用关系运算符<span lang="EN-US"> &gt;</span>、<span lang="EN-US">&lt;</span>、<span lang="EN-US">&gt;=</span>、<span lang="EN-US">&lt;= </span>和<span lang="EN-US"> !=</span>。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span class="3Char"><span style="font-size: 16pt">二<span lang="EN-US">.</span>表达式</span></span><span lang="EN-US"><br />
1.</span>布尔表达式<span lang="EN-US"><br />
XML </span>文档中包含<span lang="EN-US"> XPath </span>表达式时，必须遵循<span lang="EN-US"> XML 1.0 </span>的结构良好性规则，任何<span lang="EN-US"> &lt; </span>或<span lang="EN-US"> &lt;= </span>字符必须分别用<span lang="EN-US"> &amp;lt; </span>和<span lang="EN-US"> &amp;lt;= </span>表示。比如，<span lang="EN-US">XPath </span>表达式<span lang="EN-US"> bidIncrement &lt; 5 </span>在<span lang="EN-US"> XPointer </span>中是合法的，但是在<span lang="EN-US"> XSLT </span>文档中必须写成<span lang="EN-US"> bidIncrement &amp;lt; 5</span>。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">2.</span>数字<span lang="EN-US"><br />
XPath </span>数字是<span lang="EN-US"> 64 </span>位双精度浮点数。<span lang="EN-US">XPath </span>数字包括<span lang="EN-US">&#8220;</span>非数字<span lang="EN-US">&#8221; NaN </span>值、正无穷和负无穷、正零和负零。<span lang="EN-US"><br />
XPath </span>提供的数值运算符有：<span lang="EN-US">+</span>（加）、<span lang="EN-US">-</span>（减）、<span lang="EN-US">*</span>（乘）、<span lang="EN-US">div</span>（除）和<span lang="EN-US"> mod</span>（整除求余）。<span lang="EN-US"><br />
</span>提示：减法（<span lang="EN-US">-</span>）运算符的前面必须有空格，因为<span lang="EN-US"> XML </span>允许字符串中包含<span lang="EN-US">&#8220;-&#8221;</span>字符。<span lang="EN-US"><br />
</span>下面是<span lang="EN-US"> XPath </span>数字表达式的一些例子：<span lang="EN-US"><br />
7 + 3 </span>返回<span lang="EN-US"> 10 <br />
7 - 3 </span>返回<span lang="EN-US"> 4 <br />
7 * 3 </span>返回<span lang="EN-US"> 21 <br />
7 div 3 </span>返回<span lang="EN-US"> 2.3333333333333335 <br />
7 mod 3 </span>返回<span lang="EN-US"> 1 <o:p></o:p></span></h2>
<h2><span lang="EN-US">3.</span>字符串<span lang="EN-US"><br />
XPath </span>中的字符串使用引号（<span lang="EN-US">' </span>或<span lang="EN-US"> "</span>）包围起来。如果<span lang="EN-US"> XML </span>文档中的<span lang="EN-US"> XPath </span>字符串包含引号，可以选择：<span lang="EN-US"><br />
</span>分别使用<span lang="EN-US"> &amp;apos; </span>或<span lang="EN-US"> &amp;quot; </span>引起来。比如，<span lang="EN-US">description = 'New <st1:chmetcnv w:st="on" unitname="m" sourcevalue="256" hasspace="False" negative="False" numbertype="1" tcsc="0">256m</st1:chmetcnv> &amp;quot;USB&amp;quot; MP3 player'<o:p></o:p></span></h2>
<h2><span class="3Char"><span style="font-size: 16pt">三<span lang="EN-US">.</span>函数库</span></span><span lang="EN-US"><br />
XPath </span>定义了一组函数，称为核心函数库。每个函数从三个方面来定义：<span lang="EN-US"><br />
(1)</span>函数名<span lang="EN-US"> <br />
(2)</span>返回类型（必须的，不能使用<span lang="EN-US"> void</span>）<span lang="EN-US"> <br />
(3)</span>参数类型（可以没有参数或者带有多个参数，参数可以是必需的也可以是可选的）<span lang="EN-US"> <br />
</span>函数被分成四类，以下分别介绍：<span lang="EN-US"><br />
1.</span>节点集函数<span lang="EN-US"> <br />
</span>节点集函数提供关于一组节点（一个或多个节点）的信息。常用的节点集函数有：<span lang="EN-US"><br />
last()――</span>返回一个称为上下文大小的数字，即给定上下文中的节点数，不同于最后一个节点。<span lang="EN-US"> <br />
position()――</span>返回一个称为上下文位置的数字，集当前节点在给上下文节点集（列表）中的位置。比如，可以用表达式<span lang="EN-US"> position()=last() </span>测试处理的是否是集合中的最后一个节点。<span lang="EN-US"> <br />
count(node-set)――</span>返回实参节点集中的节点数。比如，在<span lang="EN-US"> AuctionItemList.xml </span>文档的上下文中，<span lang="EN-US">count(//item) </span>返回<span lang="EN-US"> item </span>元素的个数，即<span lang="EN-US"> 7</span>。<span lang="EN-US"> <br />
id(object)――</span>返回一个节点集，根据在<span lang="EN-US"> DTD </span>中声明为<span lang="EN-US"> ID </span>类型的唯一标识符选择元素。因为在<span lang="EN-US"> AuctionItemList.xml </span>中没有使用 <span lang="EN-US">DTD</span>，这个例子中得到的节点集总是空集。<span lang="EN-US">Id("ItemId0001") </span>返回一个空节点集。<span lang="EN-US"> <br />
XPath </span>还定义了和节点名及名称空间有关的其他三个函数：<span lang="EN-US"><br />
local-name() <br />
namespace-uri() <br />
name() <o:p></o:p></span></h2>
<h2><span lang="EN-US">2.</span>字符串函数<span lang="EN-US"> <br />
</span>通过字符串函数您可以操纵字符串。常用的字符串函数有：<span lang="EN-US"><br />
string()――</span>把参数对象或者上下文结点转化成字符串。合法的参数包括节点集、数字、布尔值或者其他任何类型<span lang="EN-US">――</span>但是对于最后一种情况转换的结果不可预料。建议使用<span lang="EN-US"> XSLT </span>函数<span lang="EN-US"> format-number </span>把数字转化成字符串，或者使用<span lang="EN-US"> XSLT </span>元素<span lang="EN-US"> xsl:number </span>提供给用户。<span lang="EN-US"> <br />
concat()――</span>以两个或更多字符串作为参数并返回这些字符串的连接。比如，<span lang="EN-US">concat("Original ","recording ","Blue Train LP record") </span>返回<span lang="EN-US"> "Original recording Blue Train LP record"</span>。<span lang="EN-US"> <br />
starts-with()――</span>如果第一个字符串参数以第二个字符串参数开始则返回<span lang="EN-US"> true</span>，否则返回<span lang="EN-US"> false</span>。比如，<span lang="EN-US">starts-with("Miles Smiles album, CD", "Miles") </span>返回<span lang="EN-US"> true</span>。<span lang="EN-US"> <br />
contains()――</span>如果第一个字符串参数包含第二个字符串参数则返回<span lang="EN-US"> true</span>，否则返回<span lang="EN-US"> false</span>。比如，<span lang="EN-US">contains("Miles Smiles album, CD", "album") </span>返回<span lang="EN-US"> true</span>。<span lang="EN-US"> <br />
</span>其他的<span lang="EN-US"> XPath </span>字符串函数包括：<span lang="EN-US">substring()</span>、<span lang="EN-US">substring-before()</span>、<span lang="EN-US">substring-after()</span>、<span lang="EN-US">string-length()</span>、<span lang="EN-US">normalize-space() </span>和<span lang="EN-US"> translate()</span>。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">3.</span>布尔函数<span lang="EN-US"> <br />
</span>布尔函数用于把一个对象或字符串转化成<span lang="EN-US"> true </span>或者<span lang="EN-US"> false</span>，或者直接获得真或假的值。布尔函数有：<span lang="EN-US"><br />
boolean()――</span>根据以下规则返回作为参数传递的对象转换成布尔值的结果：不同于<span lang="EN-US"> 0 </span>或者<span lang="EN-US"> NaN </span>的数字为<span lang="EN-US"> true</span>；非空的节点集或者字符串为<span lang="EN-US"> true</span>。其他类型的对象已不可预料的方式转换。<span lang="EN-US"> <br />
not()――</span>如果作为参数传递的布尔值为<span lang="EN-US"> false </span>返回<span lang="EN-US"> true</span>，否则返回<span lang="EN-US"> false</span>。<span lang="EN-US"> <br />
true() </span>和<span lang="EN-US"> false()――</span>分别返回<span lang="EN-US"> true </span>或<span lang="EN-US"> false</span>。这些函数很有用，因为在<span lang="EN-US"> XPath </span>中<span lang="EN-US"> true </span>和<span lang="EN-US"> false </span>被看作是普通的字符串而不是真和假的值。<span lang="EN-US"> <br />
lang()――</span>如果上下文节点的语言和字符串参数中指定的语言相同，或者是它的一种子语言返回<span lang="EN-US"> true</span>，否则返回<span lang="EN-US"> false</span>。<span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">4.</span>数字函数<span lang="EN-US"> <br />
</span>数字函数是<span lang="EN-US"> XPath </span>的数值函数，都返回数字。其中包括：<span lang="EN-US"><br />
number()――</span>把可选的对象参数（如果没有指定参数则使用上下文节点）转化成数字，转换的规则如下：<span lang="EN-US"> <br />
&nbsp;</span>布尔值<span lang="EN-US"> true </span>转换成<span lang="EN-US">1</span>，<span lang="EN-US">false </span>转换成<span lang="EN-US"> 0</span>。<span lang="EN-US"> <br />
&nbsp;</span>字符串转换成合理的数字。<span lang="EN-US"> <br />
&nbsp;</span>节点集首先转换成字符串，然后把这个字符串转换成数字。<span lang="EN-US"> <br />
&nbsp;</span>其他类型对象以不可预料的方式转换。比如，<span lang="EN-US">number("250") </span>返回<span lang="EN-US"> 250</span>，而<span lang="EN-US"> number("miles1965") </span>返回<span lang="EN-US"> NaN</span>。<span lang="EN-US"> <br />
sum()――</span>对节点集参数中的所有节点应用<span lang="EN-US"> number() </span>函数后返回它们的和。<span lang="EN-US"> <br />
floor()――</span>返回不大于数字参数的最大整数数字。比如，<span lang="EN-US">floor(2.75) </span>返回<span lang="EN-US"> 2</span>。<span lang="EN-US"> <br />
ceiling()――</span>返回不小于数字参数的最小整数数字。比如，<span lang="EN-US">ceiling(2.75) </span>返回<span lang="EN-US"> 3</span>。<span lang="EN-US"> <br />
round()――</span>返回和数字参数最接近的整数数字。比如，<span lang="EN-US">round(2.75) </span>返回<span lang="EN-US"> 3</span>。 <span lang="EN-US"><o:p></o:p></span></h2>
<h2><span lang="EN-US">&nbsp;<o:p></o:p></span></h2>
<h2><span lang="EN-US">
<h1>XML Path Language (XPath)<br />
Version 1.0</h1>
<h2>W3C Recommendation 16 November 1999</h2>
<dl>
<dt>This version:
<dd><a href="http://www.w3.org/TR/1999/REC-xpath-19991116">http://www.w3.org/TR/1999/REC-xpath-19991116</a> <br />
(available in <a href="http://www.w3.org/TR/1999/REC-xpath-19991116.xml">XML</a> or <a href="http://www.w3.org/TR/1999/REC-xpath-19991116.html">HTML</a>)
<dt>Latest version:
<dd><a href="http://www.w3.org/TR/xpath">http://www.w3.org/TR/xpath</a> <br />
<dt>Previous versions:
<dd><a href="http://www.w3.org/TR/1999/PR-xpath-19991008">http://www.w3.org/TR/1999/PR-xpath-19991008</a> <br />
<a href="http://www.w3.org/1999/08/WD-xpath-19990813">http://www.w3.org/1999/08/WD-xpath-19990813</a> <br />
<a href="http://www.w3.org/1999/07/WD-xpath-19990709">http://www.w3.org/1999/07/WD-xpath-19990709</a> <br />
<a href="http://www.w3.org/TR/1999/WD-xslt-19990421">http://www.w3.org/TR/1999/WD-xslt-19990421</a> <br />
<dt>Editors:
<dd>James Clark <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#106;&#99;&#64;&#106;&#99;&#108;&#97;&#114;&#107;&#46;&#99;&#111;&#109;">&lt;jjc@jclark.com&gt;</a> <br />
Steve DeRose (Inso Corp. and Brown University) <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#83;&#116;&#101;&#118;&#101;&#110;&#95;&#68;&#101;&#82;&#111;&#115;&#101;&#64;&#66;&#114;&#111;&#119;&#110;&#46;&#101;&#100;&#117;">&lt;Steven_DeRose@Brown.edu&gt;</a> <br />
</dd></dl>
<p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice.html#Copyright">Copyright</a> &nbsp;&#169;&nbsp; 1999 <a href="http://www.w3.org/">W3C</a><sup>&#174;</sup> (<a href="http://www.lcs.mit.edu/">MIT</a>, <a href="http://www.inria.fr/">INRIA</a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice.html#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice.html#W3C_Trademarks">trademark</a>, <a href="http://www.w3.org/Consortium/Legal/copyright-documents.html">document use</a> and <a href="http://www.w3.org/Consortium/Legal/copyright-software.html">software licensing</a> rules apply. </p>
<br />
&nbsp;<o:p></o:p></span></h2>
<h2 class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></h2>
<img src ="http://www.blogjava.net/honeybee/aggbug/161733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honeybee/" target="_blank">sun</a> 2007-11-19 22:24 <a href="http://www.blogjava.net/honeybee/articles/161733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xml解析</title><link>http://www.blogjava.net/honeybee/articles/161163.html</link><dc:creator>sun</dc:creator><author>sun</author><pubDate>Fri, 16 Nov 2007 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/honeybee/articles/161163.html</guid><wfw:comment>http://www.blogjava.net/honeybee/comments/161163.html</wfw:comment><comments>http://www.blogjava.net/honeybee/articles/161163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honeybee/comments/commentRss/161163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honeybee/services/trackbacks/161163.html</trackback:ping><description><![CDATA[下面的.xml文件，假设url:&nbsp;<a href="http://www.youtube.com/api2_rest?method=youtube.videos.list_by_tag&amp;dev_id=s2gNEM-7qoU&amp;tag=New+York">http://www.youtube.com/api2_rest?method=youtube.videos.list_by_tag&amp;dev_id=s2gNEM-7qoU&amp;tag=New+York</a><br />
&lt;NodeSet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Node&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Node&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Node&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Node&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;summary&gt;<br />
&lt;/NodeSet&gt;<br />
<br />
解析一般方法 ：<br />
DocumentBuilder builder = <br />
&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilderFactory.newInstance().newDocumentBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;Document hostDoc =builder.parse(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new InputSource(new StringReader("&lt;div /&gt;")));<br />
&nbsp;&nbsp;&nbsp;Node hostRoot = hostDoc.getDocumentElement();&nbsp;&nbsp;&nbsp; <br />
Document <span style="color: red">document</span>= builder.parse(baseURL);&nbsp;&nbsp; // baseURL在上面我们已经给出，<span style="color: red">document</span>用于成为下面的被解析对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XPath xpath = XPathFactory.newInstance().newXPath();<br />
&nbsp;&nbsp;&nbsp;&nbsp;String expression = "/NodeSet/Node/";&nbsp;&nbsp;&nbsp; //首先解析NodeSet/Node，可以发现本例有多个Node<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;NodeList recordNodes = (NodeList) xpath.evaluate(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression, <span style="color: red">document</span>, XPathConstants.NODESET);&nbsp;&nbsp;&nbsp;&nbsp; //由于本例有多个Node，因此使用NodeList存储所有的Node，evaluate函数表示将document（及本.xml文件，其url通过parse函数得到）上下文的expression（&#8220;Node&#8221;）存储在一起（NODESET）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;recordNodes.getLength();i++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下面对于每一个Node元素进行解析<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String template = "&lt;p&gt;&lt;b&gt;&lt;<span style="color: red">value</span>/&gt;&lt;/b&gt;:&lt;<span style="color: red">value</span>/&gt;&lt;/p&gt;";&nbsp;&nbsp; //template给出了解析模板<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Document <span style="color: red">templateDoc</span> = builder.parse(new InputSource(new StringReader(template)));&nbsp;&nbsp; //对templateDoc解析成模板的形式，templateDoc为被解析对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[] elementValues = {"title","summary"};&nbsp;&nbsp; //即Node的子元素title,summary<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression="//<span style="color: red">value</span>";&nbsp;&nbsp; //<span style="color: red">注意</span>value与模板中的项对应<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NodeList templateNodes = (NodeList) xpath.evaluate(expression, <span style="color: red">templateDoc,</span> XPathConstants.NODESET);&nbsp;//下面解析Node的子元素（即title,summary），由于子元素不唯一，故以NodeList形式存储，evaluate函数表示将templateDoc（及形如"&lt;p&gt;&lt;b&gt;&lt;<span style="color: red">value</span>/&gt;&lt;/b&gt;:&lt;<span style="color: red">value</span>/&gt;&lt;/p&gt;"的被解析对象）上下文的expression（&#8220;value&#8221;）存储在一起（NODESET）。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;templateNodes.getLength();j++){&nbsp;&nbsp;&nbsp;&nbsp; //下面对于每一个Node元素的子元素title，summary进行解析<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node thistemplateNode = templateNodes.item(j);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //item(0)表示title, item(1)表示summary<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node parent = thistemplateNode.getParentNode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if( (Boolean) xpath.evaluate(elementValues[j], recordNodes.item(i), XPathConstants.BOOLEAN)){//recordNodes对应于&lt;Node&gt;，elementValues对应于&lt;title&gt;此时j=0，及&lt;summary&gt; 此时j=1，本条件判断对于Node&#8220;i&#8221;是否存在elementValues[j]，默认true。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node replaceNode =(Node) xpath.evaluate(elementValues[j], recordNodes.item(i), XPathConstants.NODE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String replacement = replaceNode.getTextContent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Node replacementNode = templateDoc.createTextNode(replacement);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;parent.replaceChild(replacementNode, thistemplateNode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Node importedNode = hostDoc.importNode(templateDoc.getDocumentElement(), true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;hostRoot.appendChild(importedNode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;hostRoot.appendChild(hostDoc.createTextNode("\n"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
总结起来，解析xml的一般步骤：<br />
从解析外部开始，逐层深入解析内部。<br />
先得到NodeList，后得到Node。
 <img src ="http://www.blogjava.net/honeybee/aggbug/161163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honeybee/" target="_blank">sun</a> 2007-11-17 01:27 <a href="http://www.blogjava.net/honeybee/articles/161163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>