我不熟悉使用xml和xsd的东西。我正在尝试使用Guzzle创建一个Web服务客户端:
http://guzzlephp.org/index.html
我可以按照本教程创建一个非常基本的客户端和1个命令:
http://guzzlephp.org/tour/building_services.html
我遇到的问题是如何将返回的XML转换为更有用的格式。我正在使用的Web服务(及其文档和xsd)可以在这里找到:
http://www.epo.org/searching/free/ops.html
我得到一个SimpleXMLElement。假设以下XML内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/2.6.2/style/exchange.xsl"?>
<ops:world-patent-data xmlns:ops="http://ops.epo.org" xmlns="http://www.epo.org/exchange" xmlns:ccd="http://www.epo.org/ccd" xmlns:xlink="http://www.w3.org/1999/xlink">
<ops:meta name="elapsed-time" value="30"/>
<exchange-documents>
<exchange-document system="ops.epo.org" family-id="19768124" country="EP" doc-number="1000000" kind="A1">
<bibliographic-data>
<publication-reference>
<document-id document-id-type="docdb">
<country>EP</country>
<doc-number>1000000</doc-number>
<kind>A1</kind>
<date>20000517</date>
</document-id>
<document-id document-id-type="epodoc">
<doc-number>EP1000000</doc-number>
<date>20000517</date>
</document-id>
</publication-reference>
<!-- a lot of content snipped -->
</bibliographic-data>
</exchange-document>
</exchange-documents>
</ops:world-patent-data>
我如何作为一个非常简单的例子提取doc-number(在上面的XML的第11行)?
我试过了:
$xpath = '/ops:world-patent-data/exchange-documents/exchange-document/bibliographic-data/publication-reference/document-id/doc-number';
$data = $result->xpath($xpath);
及其变体,但$ data始终为空数组。
答案 0 :(得分:1)
XPath允许这样:
//document-id
将返回所有document-id
个节点,无论它们在DOM中的位置如何。您不必指定绝对/.../.../.../
类型路径,除非您真的需要确定某些位置。
答案 1 :(得分:1)
我认为您的问题与名称空间前缀的使用相关。我要做的(作为最佳实践)是确保在编写我的xpath之前注册自己的前缀和命名空间。这样,我会使用由我控制的前缀。
PHP有一种奇怪的(在我看来)处理这个问题的方式,因为它允许“默认”方式,即尝试自己解析前缀。在您的情况下,由于exchange-documents/exchange-document/bibliographic-data/publication-reference/document-id/doc-number
,此路径xmlns="http://www.epo.org/exchange"
中的代码实际上是合格的。如果你要为这个命名空间注册一个前缀,并在你的XPath中使用它,我相信你的东西会起作用。
看看这个PHP help topic,了解更多信息......