使用 XPath 与 PHP

在处理 XML 时让 XPath 帮您完成繁重的工作

如果超出 CRUD 操作的范畴执行您的 PHP 应用程序,那么您极有可能已经使用了 XML。导航整个 XML 文档或数据流来获得想要的数据元素往往比较麻烦,对于 PHP 开发人员而言,甚至有些吓人。如果 XML 数据结构十分复杂,那么情况就会更糟糕。XPath 是一种 W3C 标准,其唯一用途就是定位正确的数据元素,或更确切地说,是定位想要的节点。PHP 通过将 XPath 用作其 XML 类和函数,从而提供对 XPath 的支持。在本文中,您将会看到几个在 XML 中定位信息以及 XPath 如何在您的 PHP 应用程序中帮您完成繁重工作的基础场景。

Tracy Bost, 顾问及培训师, 自由职业

作者照片 - Tracy BostTracy Bost 是一名经验丰富的软件开发人员和系统工程师。他的专长是企业应用程序集成。他过去曾担任过抵押行业标准维护组织 (Mortgage Industry Standards Maintenance Organization, MISMO) 业务规则工作组的联合主席和 RuleML2010 行业标准的委员会联合主席。他曾在多个行业任职,这些行业包括抵押贷款、房地产和非营利行业。



2011 年 11 月 28 日

常用缩略词

  • API:应用程序编程接口
  • CRUD:创建、读取、更新和删除
  • CSS:层叠样式表
  • DOM:文档对象模型
  • JSON:JavaScript 对象表示法
  • RDF:资源描述框架
  • REST:具象状态传输
  • RSS:简易信息聚合
  • SKU:库存单位
  • URI:统一资源标识符
  • W3C:万维网联盟
  • XHTML:可扩展超文本标记语言
  • XPath:XML 路径语言
  • XSL:可扩展样式表语言
  • XSLT:可扩展样式表语言转换

在本文中,您将了解以下的这些概念:

  • XPath 的用法
  • 编写基础的 XPath 表达式
  • 使用 PHP XML 库的 XPath 功能
  • 使用 XPath 与 PHP 转换数据格式

本文中的这几个使用 XPath 与 PHP 的实用示例可供您实践,但必须假设您已经具备了 先决条件 中描述的那些条件。

先决条件

为了从本文得到最大的收获,您应该具备有关 XML 和 PHP5 的知识,以及配置和安装 PHP 扩展的知识。此外,您还需要通过支持 PHP5 的 Web 服务器访问和了解基于 UNIX® 或 Microsoft® Windows® 的操作系统,并在该服务器上实践本文介绍的代码示例。


了解 XPath 的需求

随着 Web 不断地向原始版语义 Web 发展,应用程序之间的交互性变得更强。像 SOAP、REST、RSS 和 RDF 这类技术会是未来 Web 发展的强大动力。多数情况下,人们会选择 XML 作为描述所涉数据的消息格式。在某种程度上,您也可以使用 JSON,但 XML 仍然是占主导地位的数据交换方式。

或者,有时为了向移动用户和各种 Web 浏览器提供一个吸引人的交互式可用界面,也可能会有将 XML 数据转换成 XHTML 的需要。

将数据存储为 XML 文档并存放于一个文件系统或一个兼容 XML 的数据库中,这也是一种很流行的归档数据的方式,便于日后的任务检索,比如报告、用户界面显示或处理应用程序集成。

在处理 XML 数据时,需要对这些数据进行分析以获得最小公分母,即您想要的数据(经常被称之为原子节点值)。XSLT 是一个 W3C 标准,可将 XML 转换为其他格式,比如 HTML 和 PDF 格式,或者转换成使用不同模式的另一个 XML 文档。它主要依赖于 XPath 使用,这一点与 XQuery、XForms 和 XPointer 一样。


XPath 的背景知识

简言之,XPath 是一种用来在内存中导航整个 XML 树的语言。XPath 的设计初衷是作为一种面向 XSLT 和 XPointer 的语言。XPath 1.0 在 1999 年成为了一种 W3C 标准。较新的 XPath 2.0 已于 2007 获得规范的状态。

随着 XML 其他规范的出现,XPath 的使用也相应出现。如今,XPath 已成为在 XML 模式、ISO Schematron、XQuery 和 XForms 中导航 XML 的首选语言。具有讽刺意味的是,有可依据的理由证明 XPath 并不是基于的 XML 语法。它使用了其自身的语法来避免与 URI 和其他与 XML 相关的语法的冲突。

当您在 PHP 内使用 XPath 时,只需记住,您不能单独使用 XPath,而是要将它用作一种在内存中导航 XML 的工具,同时还要使用其他一种 XML 规范。

出于本文的目的,在讨论和示例中使用的是更为广泛采用的 XPath 1.0 规范。XPath 2.0 与 XPath 1.0 向后兼容,但 PHP 现在对 XPath 2.0 的支持仍然很有限。

XPath 规范提供了其标准用法和术语的详细描述。如果您预感到 XPath 与 PHP 的使用将会十分复杂,那么这个规范是一个很可靠的参考资源。此外,XPath 规范可总结为四个主要的关注方面,如 表 1 所述。

表 1. XPath 规范的四个主要方面
方面描述示例
位置路径包含位置步骤、轴线、谓词和简要的语法。parent::node, child::text(), attribute::*, /PRODUCTS/PRODUCT[3]/NAME
数据模型描述 XML 树。其中包含节点根、属性、文本、名称空间、元素、处理指令和命令。/, /ns1:PRODUCTS/ns1:PRODUCT, @category
表达式可能包含变量引用、函数、布尔、数、字符串和谓词。/PRODUCTS/PRODUCT/NAME[string-length( ) > 15]/../@category
函数XPath 1.0 具有 27 个内置函数,可分类为节点集、字符串、布尔或数值函数。string-length(), true(), sum()

编写 XPath 表达式

在编写 PHP 节点之前,需要花些时间来了解 XPath 节点、路径和函数。清单 1 中的 products.xml 文件提供了几个常用表达式的示例,可基于谓词定位一个 XML 路径中的数据,定位节点的原子值,以及使用函数。

清单 1. 一个示例产品 XML 文档 (products.xml)
<?xml version="1.0" encoding="UTF-8"?>
<PRODUCTS>
<PRODUCT category="software">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Business Analysis</SUB_CATEGORY>
<NAME>Widget Reporting</NAME>
<PRICE>4500</PRICE>
</PRODUCT>
<PRODUCT category="software">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Business Analysis</SUB_CATEGORY>
<NAME>Pro Reporting</NAME>
<PRICE>2300</PRICE>
</PRODUCT>
<PRODUCT category="storage">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Tape Systems</SUB_CATEGORY>
<NAME>Tapes Abound</NAME>
<PRICE>2300</PRICE>
</PRODUCT>
<PRODUCT category="storage">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Disk Systems</SUB_CATEGORY>
<NAME>Widget100 Series</NAME>
<PRICE>6500</PRICE>
</PRODUCT>
</PRODUCTS>

/PRODUCTS 返回 PRODUCTS 节点的所有子节点,共有四个。请注意其中的前斜杠 (/) 符号。如果您熟悉基于 UNIX 的操作系统,就会知道前斜杠代表的是绝对值。在 UNIX 文件路径中,如果对当前上下文位置不是很确定,就可以使用一个绝对路径。对于 清单 1 中的文档,PRODUCTS 是根节点。

相对路径也适用于 XPath。当在表达式中使用 .. 时,它能指示表达式从层次结构中的当前节点上提一层(这亦类似于 UNIX 操作系统内目录的处理)。例如,../PRODUCT/SKU 返回了与各个 PRODUCT 节点相关的四个 SKU 成员的原子节点值。

属性节点的选择需要用到 XPath 中的特殊语法。如果想要返回软件类别下所列的所有 PRODUCT 节点,表达式 /PRODUCTS/PRODUCT[@category='software'] 恰好可以实现这个目的。在这个表达式中,category 可视为是此 XML 文档内的一个属性。XPath 能够使用 at 符号 (@) 选择属性。此外,也可以使用 attribute:: 语法选择一个属性,比如,表达式 /PRODUCTS/PRODUCT[attribute::category='software']。大多数人都发现 at 符号更简练也更易于使用。

要选择成本超过 $2,500 的所有产品名称的原子节点值(即实际的文本值),可以编写这样一个表达式,即 /PRODUCTS/PRODUCT[PRICE > 2500]/NAME。当执行时,此表达式会返回产品名称 Widget ReportingWidget100 Series

在研究 XPath 与 PHP 的使用之前,先来看看最后的这个表达式示例:/PRODUCTS/PRODUCT/NAME[string-length( ) > 15]/../@category。当执行时,此表达式会返回两个值:softwarestorage。具体而言,此表达式为每个名称长度超过 15 个字符的产品匹配类别值。

清单 1 中的 XML 文档是本文内所展示的这些 XPath 表达式的源文档。


发现 PHP 中的 XPath 支持

PHP 支持 XML 和 XPath 的这一事实应该不会让人有多惊讶。实际上,这个最流行的 Web 脚本语言在其核心库中就提供了一些处理 XPath 的优秀函数。

在这些核心 PHP 库中,您在处理 XML 时,可以有如下几个选择:

  • SimpleXML
  • DOM
  • XMLWriter/Reader

SimpleXML 简单易用,非常适合相对简单的基于 XML 的琐事;它有许多局限,例如,它并不能完全支持验证、写入和名称空间。如果您处理的是一个大型的 XML 数据树,那么请务必注意 SimpleXML 在处理前是需要将整个 XML 文档加载到内存中的。

如果需要执行更为复杂的 XPath 表达式且需要对文档进行完全控制,那么就可以选用 DOM。DOM 是 Document Object Model 的缩写,也是一个 W3C 标准。可以通过将 DOM 安装为 PHP 的一个扩展来使用 PHP 启用 DOM。安装和启用 DOM 这样的扩展的操作通常都是非常简易。很多时候,它只是需取消 php.ini 文件中的一行代码注释即可启用已编译的模块。与 SimpleXML 一样,DOM 在处理前也需要将整个 XML 文档加载到内存中。正如您在本文稍后部分将要看到的,DOMXPath 使用起来也非常不错。

您还可以从 PHP Extension and Application Repository (PEAR) 存储库中下载并安装 XML_XPath。这个类使用了 DOM 并提供了使用 XPath 查询来获得文档操纵以及提取原子节点值的一种方式。

如果使用的是 Zend Framework,那么可用 Zend_Dom_Query 库。如果您具体的 PHP 框架没有提供面向 XML 和 XPath 的特殊类和函数,那么您只要使用 PHP 本身所提供的即可。

如果没有来自 SimpleXML 或 DOMXPath 的帮助,XMLWriter/Reader 并不能直接支持 XPath,所以本文中没有对其进行进一步的介绍。

无论使用何种库或框架,理解如何创建 XPath 表达式对于挖掘全部潜力至关重要。当联合使用 XPath 和 PHP XML相关库时,XPath 语法是相同的。如下的示例和演示均使用了 DOM 与 SimpleXML 组合。


在 PHP 内处理 XPath

利用 清单 1 中的示例 products.xml 文件以及 PHP5 SimpleXML API,可以试用各种 XPath 表达式。

执行 清单 2 的代码后,结果是转储整个 XML 文件,当然是在一个数组中。XPath 表达式 /PRODUCTS 得到的是根节点 (PRODUCTS) 的每个 子节点匹配项。

清单 2. 使用 SimpleXML 在一个数组内显示所有节点
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [PRODUCT] => 
Array ( [0] => SimpleXMLElement Object
( [@attributes] => Array ( [category] => software ) [SKU] =>
soft1234 [SUB_CATEGORY] => 
Business Analysis [NAME] => Widget Reporting [PRICE] => 4500 ) [1] => 
SimpleXMLElement Object 
( [@attributes] => Array ( [category] => software ) [SKU] => soft5678
[SUB_CATEGORY] =>
Business Analysis [NAME] => Pro Reporting [PRICE] => 2300 ) [2] => 
SimpleXMLElement Object
( [@attributes] => Array ( [category] => storage ) [SKU] => 
stor01010 [SUB_CATEGORY] => Tape Systems [NAME] => 
Tapes Abound [PRICE] => 1900 ) 
[3] => SimpleXMLElement Object ( [@attributes] => 
Array ( [category] => storage ) [SKU] => 
stor23232 [SUB_CATEGORY] => Disk Systems [NAME] => 
Widget100 Series [PRICE] => 6500 ) ) ) )

若执行 清单 3 中的代码,结果得到的是此 XML 树中每个 NAME 节点值的数组输出。请注意,表达式 /PRODUCTS/PRODUCT/NAME 是如何定位这个 XML 树中所匹配的每个 节点的,而不只是定位第一个或最后一个节点。

清单 3. 使用 SimpleXML 在一个数组内显示所有的产品名称
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT/NAME");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [0] => Widget Reporting ) 
[1] => SimpleXMLElement Object ( [0] => Pro Reporting ) [2] => 
SimpleXMLElement Object ( [0] => Tapes Abound ) [3] => 
SimpleXMLElement Object ( [0] => Widget100 Series ) )

如果需要符合某种条件的某个/某些特定的节点,可以遵循清单 45 中所列的示例。

定位原子节点值也就是从 XML 文档中提取想要的值。执行 清单 4 的代码后,结果得到的是一个 节点的原子值。

清单 4. 使用 SimpleXML 显示某个 SKU 的产品名称
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [0] => Pro Reporting ) )

XPath 表达式 /PRODUCTS/PRODUCT[SKU='soft5678']/NAME 指定了与这个表达式相匹配的所有 节点。在本例中,只有一个产品与 SKU 号相匹配。若要根据其在 XML 树中的位置 来定位一个节点的值,可以使用 position() 函数。

您还可以使用 XPath 中的条件表达式来进一步精确定位特定节点的位置。清单 5 显示了一个结合使用 SimpleXML 和 XPath 以及条件表达式的示例。

清单 5. 使用 SimpleXML 并基于一个条件定位产品
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT[@category='software' and PRICE > 2500]"); 
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [@attributes] => 
Array ( [category] => software ) 
[SKU] => soft1234 [SUB_CATEGORY] => Business Analysis [NAME] =>
 Widget Reporting [PRICE] => 4500 ) )

您可能已经注意到,清单 2清单 3清单 4清单 5 使用了完全相同的 PHP 代码(只有 XPath 表达式不同)。当您掌握了使用 SimpleXML 的步骤后,就能够充分发挥 XPath 语言的强大功能了。在使用 SimpleXML 时需要在 PHP 代码方面采取的步骤总结如下:

  1. 将 XML 文件加载到内存。
  2. 使用 Object->xpath class 编写和执行 XPath 表达式。
  3. 使用您的 PHP 技能处理所匹配的节点和值。

每个清单的输出结果均为 print_r($products); 语句。它对值进行转储 以便作为数组显示。实际上,您最有可能做的是使用 PHP 对此结果进行一些操作。

清单 6 使用了 DOM 和 DOMXPath 来处理 XML 和 XPath。

清单 6. 使用 DOMXPath 显示某个 SKU 的产品名称
<?php

$doc = new DOMDocument;
$doc->load('products.xml');
$xpath = new DOMXPath($doc);
$products = $xpath->query("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
 
foreach ($products as $product)
{
   print($product->nodeValue);
}
 ?>
------------------------------------------------------------
OUTPUT:

Pro Reporting

在 DOM 和 DOMXPath 中使用的 PHP 代码序列并不比 SimpleXML 步骤中的复杂多少。清单 6 内的步骤可以按顺序总结如下:

  1. 将 XML 文件从 DOM 对象加载入内存。
  2. 在所加载的文件中创建 XPath 对象。
  3. 查询此 XML 树并返回一个产品对象。

同样地,当您掌握了使用 DOM 的那个 PHP 代码片段后,就可以利用 XPath 完成这个繁琐的工作。


使用 XPath 进行转换

实际上,不使用 XSLT 也可以将 XML 转换成 XHTML。只要使用 SimpleXML 和 DOM,您就能够 对之前的示例进行扩展和创新并创建自己的 XHTML 文件用于显示。您可能更能接受这种方式。但是,考虑到 XPath 的使用主要是用于进行 XSLT 转换,并且 PHP 的确支持 XSLT,所以适用于在这里展示。此外,使用 XSLT 还能帮助您节省很多时间,少受失败。

PHP XSLT 转换

为了着重强调 PHP 和 XPath,本节中的转换示例并未使用任何的 CSS 或有效 URL 链接。当使用 XSLT 转换数据时,请记住您可以包括样式、JavaScript 或典型的 HTML 页面需要的任何其他的东西。此外,您的 XSL 文件很可能会在您的应用程序结构中以符合框架的方式进行精心组织。

在使用 XSLT 将 XML 数据转换成诸如 HTML 的其他格式时,要求对 XPath 有深刻了解。

RSS 和 Atom 摘要均基于 XML,所以 XPath 是浏览摘要以选择所需数据的理想工具。假设本文中有针对各种 PHP 和 XPath 技术的 Atom 摘要,您就可以使用其中一种 PHP XML 库来从摘要中提取条目并在您的网站上按需要显示。

清单 7 中这么简单的 XSLT 文件主要依赖于 XPath。

清单 7. 能将摘要转换成 HTML 的一个简单 XSLT 文件 (article_feed.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<head><title><xsl:value-of select="	 //title"/></title></head>
<table>
<tr><td><xsl:value-of select="//title"/></td></tr>
<tr><td><i>"<xsl:value-of select="//subtitle"" />",</i></td></tr>
<tr><td>by <xsl:value-of select="//author"" /></td></tr>
<xsl:for-each select="//feed/entry"">
<table border="1" > 
<tr>
<td>Title</td><td><xsl:value-of select="title""/></td>
</tr>
<tr>
<td>Summary</td><td><xsl:value-of select="summary""/></td>
</tr>
<tr>
</tr>
</table><br/>
</xsl:for-each>
</table>
</html>
</xsl:template>
</xsl:stylesheet>

两个前斜杠 (//) 指示 XPath 匹配自根节点开始的第一个命名节点。因为标题、子标题和作者各自只占一个节点,所以这是一种表达位置的快捷方式,无需输入绝对路径。由于 for-each 循环在 //feed/entry 节点的上下文中工作,所以为标题和总结使用了相对 路径。

使用 清单 7 中的这个 XSLT 文件,现在就可以编写相应的 PHP 代码来执行这种转换了,如 清单 8 所示。

清单 8. 使用 DOM 进行 XLST 转换
<?php
$doc = new DOMDocument();
$xmlStream = <<<MyFeed
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title>Using XPath with PHP</title>
<author><name>Tracy Bost</name></author>
<subtitle type="html">
Let XPath do the hard work for you when working with XML</subtitle>
<link rel="self" type="text/html"
hreflang="en" href="http://www.ibm.com/developerworks/"/>
<updated>15 Aug 2011 22:51:48 +0000</updated>
<entry> 
<title>SimpleXML & XPath </title> 
<summary>If you are using SimpleXML to parse XML or
 RSS feeds, XPath is great to use!</summary> 
<link rel="self" type="text/html" hreflang="en" href=""/> 
<published>21 Apr 2011 04:00:00 +0000</published> 
<updated>21 Apr 2011 04:00:00 +0000</updated> 
</entry> 
<entry> 
<title>DOMXPath</title> 
<summary>If you are using DOM for traversal XML documents, 
give DOMXPath a try! </summary> 
<link rel="self" type="text/html" hreflang="en" href=""/> 
<id>tag:developerWorks.dw,19 Apr 2011 04:00:00 +0000</id> 
<published>12 Aug 2011 04:00:00 +0000</published> 
<updated>12 Aug 2011 04:00:00 +0000</updated> 
</entry> 
<entry> 
<title>XMLReader with XPath</title> 
<summary>For complex XML document reading and writing, 
using XPath with XReader can ease your burden!</summary> 
<link rel="self" type="text/html" hreflang="en" href=""/> 
<id>tag:developerWorks.dw,19 Apr 2011 04:00:00 +0000</id> 
<published>08 Aug 2011 04:00:00 +0000</published> 
<updated>08 Aug 2011 04:00:00 +0000</updated> 
</entry> 
</feed> 
MyFeed;

  
$doc->loadXML($xmlStream);
$xpath = new DOMXpath($doc);
$xslt = new XSLTProcessor();
$xsl = new DOMDocument();
$xsl->load( 'xsl/article_feed.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
print $xslt->transformToXML( $XML );
?>

------------------------------------------------------------
OUTPUT: 

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Using XPath with PHP</title></head><body><table><tr>
<td>Using XPath with PHP</td></tr><tr>
<td><i>"Let XPath do the hard work for you when working with XML",</i></td>
</tr><tr><td>by Tracy Bost
</td></tr><table border="1"><tr><td>Title</td>
<td>SimpleXML & XPath </td></tr>
<tr><td>Summary</td>
<td>If you are using SimpleXML to parse XML or RSS feeds,
 XPath is great to use!</td>
</tr><tr/></table>
<br/>
<table border="1">
<tr><td>Title</td>
<td>DOMXPath</td>
</tr>
<tr><td>Summary</td>
<td>If you are using DOM for traversal XML documents, 
give DOMXPath a try! </td>
</tr><tr/></table><br/>
<table border="1">
<tr><td>Title</td><td>XMLReader with XPath</td>
</tr>
<tr><td>Summary</td>
<td>For complex XML document reading and writing, 
using XPath with XReader can ease your burden!</td>
</tr><tr/></table><br/>
</table>
</body>
</html>

注意,清单 8 中并没有使用 清单 6 中展示的 $xpath->query() 语句。所有的 XPath 表达式均位于此 XSL 文件中。只需使用 DOM 导入样式表并让它执行转换!


结束语

在本文中,向您介绍了 XPath 以及如何在 PHP5 环境中使用它来处理 XML。与 PHP 中可用的很多其他库一样,XML 库让开发人员可以专注于功能要求而不是低层次的类和对象的编写。XPath 可帮助解决在 XML 中定位和解析数据的繁琐工作。根据您的需要,您也可以选择使用 SimpleXML、DOM 或框架(比如 Zend Framework)的 XML 库。所幸的是,它们都能以一种标准的方式与 W3C XPath 协作。所以,当您加载下一个 XML 文件或数据流时,无需担心,您可以一直导航,直到获得您需要处理的下一个具体的值。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source
ArticleID=776975
ArticleTitle=使用 XPath 与 PHP
publish-date=11282011