使用XPath提取xml数据

时间:2012-10-06 00:21:36

标签: php xml xpath namespaces simplexml

我试图从下面的xml中提取数据而没有运气。

<?xml version="1.0"?>
<GetMatchingProductResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetMatchingProductResult ASIN="1908256052" status="Success">
  <Product xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
    <Identifiers>
      <MarketplaceASIN>
        <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId>
        <ASIN>1908256052</ASIN>
      </MarketplaceASIN>
    </Identifiers>
    <AttributeSets>
      <ns2:ItemAttributes xml:lang="en-GB">
        <ns2:Author>Slimming World</ns2:Author>
        <ns2:Binding>Hardcover</ns2:Binding>
        <ns2:Format>Illustrated</ns2:Format>
        <ns2:IsEligibleForTradeIn>true</ns2:IsEligibleForTradeIn>
        <ns2:Label>Slimming World</ns2:Label>
        <ns2:Languages>
          <ns2:Language>
            <ns2:Name>english</ns2:Name>
            <ns2:Type>Unknown</ns2:Type>
          </ns2:Language>
          <ns2:Language>
            <ns2:Name>english</ns2:Name>
            <ns2:Type>Original Language</ns2:Type>
          </ns2:Language>
          <ns2:Language>
            <ns2:Name>english</ns2:Name>
            <ns2:Type>Published</ns2:Type>
          </ns2:Language>
        </ns2:Languages>
        <ns2:ListPrice>
          <ns2:Amount>16.99</ns2:Amount>
          <ns2:CurrencyCode>GBP</ns2:CurrencyCode>
        </ns2:ListPrice>
        <ns2:Manufacturer>Slimming World</ns2:Manufacturer>
        <ns2:NumberOfItems>1</ns2:NumberOfItems>
        <ns2:NumberOfPages>224</ns2:NumberOfPages>
        <ns2:PackageDimensions>
          <ns2:Height Units="inches">0.87</ns2:Height>
          <ns2:Length Units="inches">9.69</ns2:Length>
          <ns2:Width Units="inches">7.64</ns2:Width>
          <ns2:Weight Units="pounds">1.85</ns2:Weight>
        </ns2:PackageDimensions>
        <ns2:ProductGroup>Book</ns2:ProductGroup>
        <ns2:ProductTypeName>ABIS_BOOK</ns2:ProductTypeName>
        <ns2:PublicationDate>2011-11-20</ns2:PublicationDate>
        <ns2:Publisher>Slimming World</ns2:Publisher>
        <ns2:SmallImage>
          <ns2:URL>http://ecx.images-amazon.com/images/I/61aM-pJlQtL._SL75_.jpg</ns2:URL>
          <ns2:Height Units="pixels">75</ns2:Height>
          <ns2:Width Units="pixels">64</ns2:Width>
        </ns2:SmallImage>
        <ns2:Studio>Slimming World</ns2:Studio>
        <ns2:Title>Slimming World Extra Easy All in One</ns2:Title>
      </ns2:ItemAttributes>
    </AttributeSets>
    <Relationships/>
    <SalesRankings>
      <SalesRank>
        <ProductCategoryId>book_display_on_website</ProductCategoryId>
        <Rank>3304</Rank>
      </SalesRank>
      <SalesRank>
        <ProductCategoryId>271146</ProductCategoryId>
        <Rank>11</Rank>
      </SalesRank>
      <SalesRank>
        <ProductCategoryId>1039764</ProductCategoryId>
        <Rank>25</Rank>
      </SalesRank>
      <SalesRank>
        <ProductCategoryId>270704</ProductCategoryId>
        <Rank>38</Rank>
      </SalesRank>
    </SalesRankings>
  </Product>
</GetMatchingProductResult>
<ResponseMetadata>
  <RequestId>8d4fde2b-d2bb-4c06-800d-68eec2effcf3</RequestId>
</ResponseMetadata>
</GetMatchingProductResponse>

我使用以下函数返回并处理repsonses

public function getXML2($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    $response = curl_exec($ch);

    $xml = simplexml_load_string($response, NULL, NULL, "http://mws.amazonservices.com/schema/Products/2011-10-01");
    $xml->registerXPathNamespace('ns2', 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd');
    return $xml;

}

当我尝试循环数据时,我无法返回任何内容

foreach($xml->xpath('//ns2:ItemAttributes') as $event) {
    $event->registerXPathNamespace('ns2', 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd');
    echo var_export($event->xpath('//ns2:author'));
}

我做错了什么?

1 个答案:

答案 0 :(得分:2)

你试过DOMDocument吗?

$dom = new DOMDocument;
$dom->loadXML($xml);

$xpath = new DOMXPath($dom);
$xpath->registerNamespace('ns2', 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd');

$el = $xpath->query('//ns2:ItemAttributes/ns2:Author');
var_dump($el->item(0)->nodeValue);

//string(14) "Slimming World"