﻿<?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-Eclipser的Java Blog-文章分类-XML</title><link>http://www.blogjava.net/eclipser/category/34571.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 11 Sep 2008 07:41:37 GMT</lastBuildDate><pubDate>Thu, 11 Sep 2008 07:41:37 GMT</pubDate><ttl>60</ttl><item><title>【转】玩转 XPath 和缺省命名空间（Default Namespaces）</title><link>http://www.blogjava.net/eclipser/articles/228367.html</link><dc:creator>eclipser</dc:creator><author>eclipser</author><pubDate>Thu, 11 Sep 2008 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/eclipser/articles/228367.html</guid><wfw:comment>http://www.blogjava.net/eclipser/comments/228367.html</wfw:comment><comments>http://www.blogjava.net/eclipser/articles/228367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eclipser/comments/commentRss/228367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eclipser/services/trackbacks/228367.html</trackback:ping><description><![CDATA[&nbsp;诸如&#8220;为什么用 XPath 的表达式进行查询，却没有返回所期望的结果？&#8221;的问题通常都与命名空间（NameSpace）有关，而且绝大多数是与缺省命名空间（Default Namespace）有关。本文试图解释这个问题并针对三种流行的 XPath 实现给出解决方法：Jaxen、JAXP XPPathFactory 以及 XSLT。
<p><br />
<strong>内容列表<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;1. 问题描述</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;2. &#8220;前缀－命名空间&#8221;映射&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;3. Jaxen 和 Dom4J<br />
&nbsp;&nbsp;&nbsp;&nbsp;4. Jaxen 和 XOM&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;5. Jaxen 和 JDOM&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;6. JAXP XPathFactory&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;7. XSLT&nbsp;<br />
&nbsp;&nbsp;&nbsp; 8.&nbsp;结束语&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;9. 资源&nbsp;</p>
<p><br />
<strong>问题描述</strong><br />
看下述 XML: <br />
&lt;catalog&gt;<br />
&nbsp; &lt;cd&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;artist&gt;Sufjan Stevens&lt;/artist&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Illinois&lt;/title&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;src&gt;http://www.sufjan.com/&lt;/src&gt; <br />
&nbsp; &lt;/cd&gt; <br />
&nbsp; &lt;cd&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;artist&gt;Stoat&lt;/artist&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Future come and get me&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;src&gt;http://www.stoatmusic.com/&lt;/src&gt; <br />
&nbsp; &lt;/cd&gt; <br />
&nbsp; &lt;cd&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;artist&gt;The White Stripes&lt;/artist&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Get behind me satan&lt;/title&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;src&gt;http://www.whitestripes.com/&lt;/src&gt; <br />
&nbsp; &lt;/cd&gt; <br />
&lt;/catalog&gt; <br />
&nbsp;&nbsp;&nbsp; 你可以使用&#8220;//cd&#8221;来得到没有在任何命名空间中定义的&#8220;cd&#8221;节点。&nbsp; <br />
&nbsp;&nbsp;&nbsp; 现在让我们来改造这个 XML，让它的所有元素都属于 'http://www.edankert.com/examples/' 命名空间中。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 为了避免在每个不同的元素前都要加个前缀，我们在根元素上定义通常所说的缺省命名空间。改造后的 XML 如下： <br />
&nbsp;<br />
&lt;catalog xmlns="<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>"&gt;<br />
&nbsp; &lt;cd&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;artist&gt;Sufjan Stevens&lt;/artist&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Illinois&lt;/title&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;src&gt;http://www.sufjan.com/&lt;/src&gt; <br />
&nbsp; &lt;/cd&gt; <br />
&nbsp; &lt;cd&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;artist&gt;Stoat&lt;/artist&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Future come and get me&lt;/title&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;src&gt;http://www.stoatmusic.com/&lt;/src&gt; <br />
&nbsp; &lt;/cd&gt; <br />
&nbsp; &lt;cd&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;artist&gt;The White Stripes&lt;/artist&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Get behind me satan&lt;/title&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;src&gt;http://www.whitestripes.com/&lt;/src&gt; <br />
&nbsp; &lt;/cd&gt; <br />
&lt;/catalog&gt; <br />
&nbsp;&nbsp;&nbsp; 当我们使用与上文相同的 XPath &#8220;//cd&#8221;，将得不到任何元素。这是因为指定的 XPath 返回的是所有不属于任何命名空间的&#8220;cd&#8221;节点，而本例中，所有的&#8220;cd&#8221;元素都属于缺省的命名空间&#8220;http://www.edankert.com/examples/&#8221;。 </p>
<p><br />
<strong>&#8220;前缀－命名空间&#8221;映射</strong></p>
<p><br />
&nbsp;&nbsp;&nbsp; 为了取出命名空间&#8220;http://www.edankert.com/examples/&#8221;中的所有&#8220;cd&#8221;元素，我们需要对 XPath 表达式做一些额外的工作。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 为了解决这个问题，XPath 规范允许我们使用 QName 来指定元素或者属性。QName 可以是元素的直接名称（形如&#8220;element&#8221;），或者包含一个前缀（形如&#8220;pre:element&#8221;）。这个前缀需要映射到一个命名空间的 URI 上。例如，如果把&#8220;pre&#8221;前缀映射到&#8220;http://www.edankert.com/test&#8221;上，则通过&#8220;pre:element&#8221;可以查找出属于命名空间&#8220;http://www.edankert.com/test&#8221;的所有 &#8220;element&#8221;元素。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 在本例中，我们把&#8220;edx&#8221;映射到&#8220;'http://www.edankert.com/examples/&#8221;命名空间上。通过 XPath&#8220;//edx:cd&#8221;就可以查找出属于&#8220;'http://www.edankert.com/examples/&#8221;命名空间的所有&#8220;cd&#8221;元素。&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; XPath 处理器允许设置&#8220;前缀－命名空间&#8221;的映射，但是，如何去映射，却要依赖于具体的实现。下文举例说明 Jaxen (JDOM/dom4j/XOM)、JAXP 以及 XSLT 中是如何进行&#8220;前缀－命名空间&#8221;的映射的。</p>
<p><br />
<strong>Jaxen 和 Dom4J</strong></p>
<p><br />
&nbsp;&nbsp;&nbsp; 下述代码从文件系统读入一个 XML 文件到 org.dom4j.Document 对象中，并且在 Document 中查找属于&#8220;http://www.edankert.com/examples/&#8221;命名空间的所有&#8220;cd&#8221;元素。<br />
&nbsp;<br />
try {<br />
&nbsp; SAXReader reader = new SAXReader();<br />
&nbsp; Document document = reader.read( "file:catalog.xml");<br />
&nbsp; <br />
&nbsp; HashMap map = new HashMap();<br />
&nbsp; map.put( "edx", "<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>");<br />
&nbsp; <br />
&nbsp; XPath xpath = new Dom4jXPath( "//edx:cd");<br />
&nbsp; xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />
&nbsp; <br />
&nbsp; List nodes = xpath.selectNodes( document);<br />
&nbsp; <br />
&nbsp; ...<br />
&nbsp; <br />
} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( DocumentException e) {<br />
&nbsp; // the document is not well-formed.<br />
&nbsp; ...<br />
}<br />
&nbsp;&nbsp;&nbsp; 第一步，创建一个 SAXReader，用来从文件系统中读取&#8220;catalog.xml&#8221;并创建一个特定于 Dom4j 的 Document 对象。 <br />
&nbsp;&nbsp;&nbsp; 第二步，对于所有 Jaxen 实现都一样，就是创建一个 HashMap 对象，用于保存&#8220;前缀－命名空间的 URI&#8221;的映射。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 为了能通过 Dom4j 使用 Jaxen 的 XPath 功能，需要创建一个与 Dom4j 相关的 XPath 对象：Dom4jXPath。创建方法是把 XPath 的表达式（即&#8220;//edx:cd&#8221;）传给 Dom4jXPath 的构造方法。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 现在，我们已经创建了 XPath 对象，接下来可以把&#8220;前缀－命名空间&#8221;的映射表传递给 XPath 引擎：把这个 HashMap 映射表用 SimpleNamespaceContext 包装起来。SimpleNamespaceContext 是 Jaxen 的 NamespaceContext 接口的默认实现类。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 最后一步就是调用 XPath 对象的 selectNodes() 方法进行查找。并把完整的 Dom4j&nbsp; Document 对象作为参数传递进去。实际上，Document 中的任何结点都可以作为参数。</p>
<p><br />
<strong>Jaxen 和 XOM</strong></p>
<strong></strong>
<p><br />
&nbsp;&nbsp;&nbsp; XOM 是基于简单的 Java DOM APIs 之上的最新工具，它的设计初衷是提供简单和易学易用的接口。 <br />
&nbsp;<br />
try {<br />
&nbsp; Builder builder = new Builder();<br />
&nbsp; Document document = builder.build( "file:catalog.xml");<br />
&nbsp; <br />
&nbsp; HashMap map = new HashMap();<br />
&nbsp; map.put( "edx", "<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>");<br />
&nbsp; <br />
&nbsp; XPath xpath = new XOMXPath( "//edx:cd");<br />
&nbsp; xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />
&nbsp; <br />
&nbsp; List nodes = xpath.selectNodes( document);<br />
&nbsp; <br />
&nbsp; ...<br />
&nbsp; <br />
} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( IOException e) {<br />
&nbsp; // An error occurred opening the document<br />
&nbsp; ...<br />
} catch ( ParsingException e) {<br />
&nbsp; // An error occurred parsing the document<br />
&nbsp; ...<br />
}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 我们需要创建一个 Builder 对象，从文件系统中读取&#8220;catalog.xml&#8221;文件，并创建出与 XOM 相关的 Document 对象。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 下一步创建出包含了&#8220;前缀－命名空间&#8221;映射关系的 HashMap 对象。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 我们需要创建一个特定于 XOM 的 XPath 对象：XOMXPath。创建方法是把 XPath 表达式传递给构造方法，然后就可以通过 XOM 使用 Jaxen 的 XPath 功能了。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 创建完 XPath 对象后，同样，我们把&#8220;前缀－命名空间&#8221;的映射表用 SimpleNamespaceContext 对象封装后，传递给 XPath 引擎。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 最后调用 XPath 对象的&#8220;selectNodes()&#8221;方法进行查找，把 XOM Document 对象作为本方法的参数。 </p>
<p><br />
<strong>Jaxen 和 JDOM</strong></p>
<strong></strong>
<p><br />
&nbsp;&nbsp;&nbsp; JDOM 是第一个提供简单的 XML 访问 API 的工具。 <br />
&nbsp;<br />
try {<br />
&nbsp; SAXBuilder builder = new SAXBuilder();<br />
&nbsp; Document document = builder.build( "file:catalog.xml");<br />
&nbsp; <br />
&nbsp; HashMap map = new HashMap();<br />
&nbsp; map.put( "edx", "<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>");<br />
&nbsp; <br />
&nbsp; XPath xpath = new JDOMXPath( "//edx:cd");<br />
&nbsp; xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />
&nbsp; <br />
&nbsp; List nodes = xpath.selectNodes( document);<br />
&nbsp; <br />
&nbsp; ...<br />
&nbsp; <br />
} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( IOException e) {<br />
&nbsp; // An error occurred opening the document<br />
&nbsp; ...<br />
} catch ( JDOMException e) {<br />
&nbsp; // An error occurred parsing the document<br />
&nbsp; ...<br />
}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 首先，通过 SAXBuilder 创建了一个特定于 JDom 的 Document 对象。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 接着创建一个特定于 JDOM 的 XPath 对象：JDOMXPath。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 然后，把&#8220;前缀－命名空间&#8221;的映射表（HashMap）用 SimpleNamespaceContext 对象封装起来，传递给 XPath 引擎。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 最后调用 XPath 对象的&#8220;selectNodes()&#8221;方法来进行查找，并把 JDOM 的 Document 对象作为本方法的输入参数。</p>
<p><br />
<strong>JAXP XPathFactory</strong></p>
<p><br />
&nbsp;&nbsp;&nbsp; 从 1.3 版起， JAXP 还提供了一种在 XML Object Models 上进行查询的通用机制。 <br />
&nbsp;<br />
try {<br />
&nbsp;DocumentBuilderFactory domFactory =DocumentBuilderFactory.newInstance();<br />
&nbsp; domFactory.setNamespaceAware( true);<br />
&nbsp; <br />
&nbsp;DocumentBuilder builder = domFactory.newDocumentBuilder();Document document = builder.parse( new InputSource( "file:catalog.xml"));<br />
&nbsp; <br />
&nbsp;XPathFactory factory =XPathFactory.newInstance();<br />
&nbsp;XPath xpath = factory.newXPath();<br />
&nbsp; xpath.setNamespaceContext( new NamespaceContext() {<br />
&nbsp;&nbsp;&nbsp; public String getNamespaceURI(String prefix) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( prefix.equals( "edx")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if ... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return XPathConstants.NULL_NS_URI;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getPrefix(String namespaceURI) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( namespaceURI.equals( "<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "edx";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if ... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Iterator getPrefixes(String namespaceURI) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; ArrayList list = new ArrayList();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( namespaceURI.equals( "<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add( "edx");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if ... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list.iterator();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; });<br />
&nbsp; <br />
&nbsp;Object nodes = xpath.evaluate( "//edx:cd", document.getDocumentElement(), <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;&nbsp;&nbsp;&nbsp; XPathConstants.NODESET);<br />
&nbsp; <br />
&nbsp; ...<br />
&nbsp; <br />
} catch (ParserConfigurationException e) {<br />
&nbsp; ...<br />
} catch (XPathExpressionException e) {<br />
&nbsp; ...<br />
} catch (SAXException e) {<br />
&nbsp; ...<br />
} catch (IOException e) {<br />
&nbsp; ...<br />
}<br />
&nbsp;&nbsp;&nbsp; 首先用 JAXP 的 DocumentBuilderFactory 创建一个org.w3c.dom.Document 对象，确保启用了 namespace 处理功能。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 现在可以通过 XPathFactory 来创建 XPath 对象，并通过 XPath 对象对文档进行查询。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 为了创建&#8220;前缀－命名空间&#8221;映射并传递给 XPath 引擎，我们需要实现 NamespaceContext 接口，该接口目前还没有默认实现类。这就意味着要实现 getNamespaceURI、getPrefix 和getPrefixes 方法，并确保这些方法能返回正确的值，包括&#8220;xmlns&#8221;和&#8220;xml&#8221;前缀所对应的命名空间的 URI 值。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 把我们自己实现的 NamespaceContext 对象传递给 XPath 引擎后，就可以通过 evaluate 方法来查询 XPath 表达式所对应的元素：使用上文中提到的 XPath 表达式，并使用 Document 的根节点作为输入入参数，并接收一个 NodeList 对象作为返回结果。 <br />
<strong>XSLT</strong></p>
<p><br />
&nbsp;&nbsp;&nbsp; XPath 设计的初衷是用于 XSLT。这也许能解释&#8220;为什么在 XSLT 中定义命名空间的前缀是一件很平常的事&#8221;（也许因为 XSLT 也是一个 XML 名词的缘故吧）。 <br />
&nbsp;<br />
&lt;xsl:stylesheet version="1.1" xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>"&gt;<br />
&nbsp; &lt;xsl:template match="//edx:cd" xmlns:edx="<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;xsl:apply-templates/&gt;<br />
&nbsp; &lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 只需要使用 XML 本身的机制，简单地为 edx 前缀赋予一个命名空间的 URI 值。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 通过与我们的 XPath 表达式&#8220;//edx:cd&#8221;相匹配的 xsl:template，能得到与上文其他例子相同的输出结果。 </p>
<p><br />
<strong>结束语</strong></p>
<p><br />
&nbsp;&nbsp;&nbsp; 为了在（缺省）命名空间上使用 XPath 表达式，我们需要指定一个&#8220;前缀－命名空间&#8221;映射。正如我们所看到的，具体使用什么样的前缀名称，是无关紧要的。 <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 同样的方法，也可以用于查询那些用其他前缀修饰的元素。这意味着上面的例子对下述 XML 也有效。下述 XML 没有使用缺省命名空间，而是使用了 examples 作命名空间的前缀： <br />
&nbsp;<br />
&lt;examples:catalog xmlns:examples="<a href="http://www.edankert.com/examples/">http://www.edankert.com/examples/</a>"&gt;<br />
&nbsp; &lt;examples:cd&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:artist&gt;Sufjan Stevens&lt;/examples:artist&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:title&gt;Illinois&lt;/examples:title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:src&gt;http://www.sufjan.com/&lt;/examples:src&gt;<br />
&nbsp; &lt;/examples:cd&gt;<br />
&nbsp; &lt;examples:cd&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:artist&gt;Stoat&lt;/examples:artist&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:title&gt;Future come and get me&lt;/examples:title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:src&gt;http://www.stoatmusic.com/&lt;/examples:src&gt;<br />
&nbsp; &lt;/examples:cd&gt;<br />
&nbsp; &lt;examples:cd&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:artist&gt;The White Stripes&lt;/examples:artist&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:title&gt;Get behind me satan&lt;/examples:title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;examples:src&gt;http://www.whitestripes.com/&lt;/examples:src&gt;<br />
&nbsp; &lt;/examples:cd&gt;<br />
&lt;/examples:catalog&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 使用&#8220;//edx:cd&#8221;作为 XPath 表达式，使用与前文例子相同的&#8220;前缀－命名空间&#8221;映射，在这个 XML 上同样能查询出属于&#8220;http://www.edankert.com/examples/&#8221;命名空间的所有&#8220;cd&#8221;元素。 </p>
<img src ="http://www.blogjava.net/eclipser/aggbug/228367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eclipser/" target="_blank">eclipser</a> 2008-09-11 15:33 <a href="http://www.blogjava.net/eclipser/articles/228367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>