使用xpath查找SimpleXMLElement的标签

时间:2014-08-24 18:50:10

标签: php xml

我尝试获取以下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 &amp; Yearbooks</Name>
                    </BrowseNode>
                    <BrowseNode>
                        <BrowseNodeId>11448</BrowseNodeId>
                        <Name>Atlases &amp; 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语法吗?

1 个答案:

答案 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 *及类似内容中回答过这个问题。