在php中使用for循环解析XML

时间:2012-10-09 20:16:56

标签: php xml xml-parsing

我正在尝试解析XML文档。当我查看var_dump时,我可以获得所有信息,但我需要做的是从文档中提取Id和图像URL。我已经尝试过为每个循环使用一个循环,它将循环正确的次数,但我需要的Id号永远不会改变。 XML文档是:

<?xml version="1.0"?>
<GetMatchingProductForIdResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetMatchingProductForIdResult Id="9781124028491" IdType="ISBN" status="ClientError">
 <Error>
<Type>Sender</Type>
<Code>InvalidParameterValue</Code>
<Message>Invalid ISBN identifier 9781124028491 for marketplace ATVPDKIKX0DER</Message>
</Error>
</GetMatchingProductForIdResult>
<GetMatchingProductForIdResult Id="9780030114687" IdType="ISBN" status="Success">
<Products xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
<Product>
  <Identifiers>
    <MarketplaceASIN>
      <MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
      <ASIN>0030114683</ASIN>
    </MarketplaceASIN>
  </Identifiers>
  <AttributeSets>
    <ns2:ItemAttributes xml:lang="en-US">
      <ns2:Author>Turk, Jonathan.</ns2:Author>
      <ns2:Binding>Unknown Binding</ns2:Binding>
      <ns2:Label>Saunders College Publishers, USA</ns2:Label>
      <ns2:Manufacturer>Saunders College Publishers, USA</ns2:Manufacturer>
      <ns2:ProductGroup>Book</ns2:ProductGroup>
      <ns2:ProductTypeName>BOOKS_1973_AND_LATER</ns2:ProductTypeName>
      <ns2:PublicationDate>2004-12-07</ns2:PublicationDate>
      <ns2:Publisher>Saunders College Publishers, USA</ns2:Publisher>
      <ns2:SmallImage>
        <ns2:URL>http://g-ecx.images-amazon.com/images/G/01/x-site/icons/no-img-sm._V192198896_.gif</ns2:URL>
        <ns2:Height Units="pixels">40</ns2:Height>
        <ns2:Width Units="pixels">60</ns2:Width>
      </ns2:SmallImage>
      <ns2:Studio>Saunders College Publishers, USA</ns2:Studio>
      <ns2:Title>Introduction to Environmental Studies.</ns2:Title>
    </ns2:ItemAttributes>
  </AttributeSets>
  <Relationships/>
  <SalesRankings/>
</Product>

为了简洁,我把它剪下来了。 我的php是这样的:

 foreach($parsed_xml->GetMatchingProductForIdResult as $item ) {
 //$ean =$parsed_xml->GetMatchingProductForIdResult->attributes()->Id; var_dump($ean);//->attributes()->Id
 $current = $parsed_xml->GetMatchingProductForIdResult->Products;

        print_r(" passed the foreach statement ");

 //$status = $parsed_xml->GetMatchingProductForIdResult->attributes()->status;

     //$isbn13 = $ean;print_r($isbn13);
      if(isset($parsed_xml->GetMatchingProductForIdResult, $current, $current->Product, $current->Product->AttributeSets)){
        $amazonResult = array(
                            'isbn' => $parsed_xml->GetMatchingProductForIdResult->attributes()->Id,//$isbn13,
            'ImageURL' => str_replace('SL75','SL200',$current->Product->AttributeSets->children('ns2', true)->ItemAttributes->SmallImage->URL),
                            );
   print_r(" Success was true ");

     }  else {

$amazonResult = array(
                            'isbn' => $parsed_xml->GetMatchingProductForIdResult->attributes()->Id,//$isbn13,
            'ImageURL' => "Jim",
                            );
    print_r(" Success was false ");
}    
    //update image in images table
    print_r(" at the insert statement ");
$conn->query("INSERT INTO images (isbn, image) VALUES ('" . $amazonResult['isbn'] . "', '" . $amazonResult['ImageURL'] . "')");

如何在完成循环时获取每个ID?

1 个答案:

答案 0 :(得分:2)

经过多次试验和错误后的最终解决方案是:

    $parsed_xml = ProductId_xml($isbn);


  foreach($parsed_xml->GetMatchingProductForIdResult as $item ) {
 $ean =$item->attributes()->Id;
$current = $item->Products;

 $status = $item->attributes()->status;

      if (stristr($status, "Success") == true)
{
        $amazonResult = array(
                            'isbn' => $ean,//$parsed_xml->GetMatchingProductForIdResult->attributes()->Id,
            'ImageURL' => str_replace('SL75','SL200',$current->Product->AttributeSets->children('ns2', true)->ItemAttributes->SmallImage->URL),
                            );

     }  else {

$amazonResult = array(
                            'isbn' => $ean,
            'ImageURL' => "",
                            );

}

我需要在foreach语句之后使用$ item。