我尝试获取以下XML文件的所有BrowseNodeId:
<?xml version="1.0" ?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2013-08-01">
<OperationRequest>
<RequestId>00ffd0c4-65b8-40ed-96b3-dbee109c508e</RequestId>
<Arguments>
<Argument Name="Condition" Value="All"></Argument>
<Argument Name="region" Value="com"></Argument>
</Arguments>
<RequestProcessingTime>0.0428190000000000</RequestProcessingTime>
</OperationRequest>
<Items>
<Request>
<IsValid>True</IsValid>
<ItemSearchRequest>
<Condition>All</Condition>
<Keywords>0321185587</Keywords>
<ResponseGroup>BrowseNodes</ResponseGroup>
<SearchIndex>Books</SearchIndex>
</ItemSearchRequest>
</Request>
<TotalResults>1</TotalResults>
<TotalPages>1</TotalPages>
<Item>
<ASIN>0321185587</ASIN>
<BrowseNodes>
<BrowseNode>
<BrowseNodeId>21</BrowseNodeId>
<Name>Reference</Name>
<Children>
<BrowseNode>
<BrowseNodeId>11444</BrowseNodeId>
<Name>Almanacs & Yearbooks</Name>
</BrowseNode>
<BrowseNode>
<BrowseNodeId>11448</BrowseNodeId>
<Name>Atlases & Maps</Name>
</BrowseNode>
<BrowseNode>
<BrowseNodeId>2572</BrowseNodeId>
<Name>Careers</Name>
</BrowseNode>
</Children>
</BrowseNode>
</BrowseNodes>
</Item>
</Items>
</ItemSearchResponse>
这是我使用的PHP代码:
$xml= simplexml_load_file($xml_file);
foreach ($xml->xpath('//BrowseNode') as $node) {
echo $node->BrowseNodeId.":".$node->Name."<br>";
}
但结果是NULL。我不擅长XML,所以我无法弄清楚我错在哪里。有人能告诉我这种情况的正确xpath语法吗?
答案 0 :(得分:2)
这是因为您的文档在NULL命名空间中没有名为BrowseNode
的节点。
而是在BrowseNode
命名空间中有名为http://webservices.amazon.com/AWSECommerceService/2013-08-01
的节点。
要通过xpath访问这些节点,您需要先为该命名空间注册一个前缀:
$xml->registerXPathNamespace(
"prefix",
"http://webservices.amazon.com/AWSECommerceService/2013-08-01"
);
然后,您可以在xpath查询中使用前缀:
foreach ($xml->xpath('//prefix:BrowseNode') as $node) {
echo $node->BrowseNodeId, ":", $node->Name, "\n";
}
(你肯定可以给那个前缀一个不同的名字,所以它说的更多,也许&#34; awsecs
&#34;,但这取决于你。)< / p>
然后您将获得预期结果:
21:Reference
11444:Almanacs & Yearbooks
11448:Atlases & Maps
2572:Careers
早先在xPath finds nothing but *及类似内容中回答过这个问题。