3

私は次のようなXMLファイルを持っています:

<?xml version="1.0" encoding="UTF-8"?>
<GeteBayDetailsResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2012-07-04T13:54:51.873Z</Timestamp>
  <Ack>Success</Ack>
  <Version>779</Version>
  <Build>E779_CORE_BUNDLED_14986049_R1</Build>
  <SiteDetails>
    <Site>US</Site>
    <SiteID>0</SiteID>
    <DetailVersion>1</DetailVersion>
    <UpdateTime>2009-07-09T10:48:17.000Z</UpdateTime>
  </SiteDetails>
  <SiteDetails>
    <Site>Canada</Site>
    <SiteID>2</SiteID>
    <DetailVersion>1</DetailVersion>
    <UpdateTime>2009-07-09T10:48:17.000Z</UpdateTime>
  </SiteDetails>
</GeteBayDetailsResponse>

Siteノードが何にでも等しいSiteIDノードの値を取得する方法を見つけようとしています。

XPath関数とDomDocument関数を使用してみましたが、うまくいきませんでした。混乱したコードのいくつかを以下に示します。

    $xml_file ='SiteDetails.xml';
    $xmlDoc = new DomDocument();
    $xmlDoc->load($xml_file);
    $xpath = new DOMXpath($xmlDoc);

    $xpath->registerNamespace('ebay', 'urn:ebay:apis:eBLBaseComponents');

    //$siteIDList = $xpath->query("/ebay:GeteBayDetailsResponse/ebay:SiteDetails[ebay:Site='UK']/ebay:SiteID");
    //$siteIDList =  $xpath->query("/GeteBayDetailsResponse/SiteDetails[Site=\"UK\"]/SiteID");

//$siteIDList =  $xpath->query("//*[namespace-uri()='urn:ebay:apis:eBLBaseComponents' and name()='Site' and text()='$site']/following-sibling::*[namespace-uri()='urn:ebay:apis:eBLBaseComponents' and name()='SiteID']/text()");

    //var_dump($siteIDList);
    //echo $siteIDList->item(0)->nodeValue;

            /*$SiteDetails = $xmlDoc->getElementsByTagName('SiteDetails');
            $count = 0;
            foreach($SiteDetails as $details){
            //  print_r($details);
            echo $details->nodeValue;
                if ($details->nodeValue == $site){
                    echo 'YEAH';
                    echo $details->SiteID;
                }
            $count ++;  
            }*/
            //$siteID = $siteIDNode->item(8)->nodeValue;        

    //var_dump($siteIDNode);
}

誰か助けてもらえますか?上からわかるように、私は混乱しています...

4

1 に答える 1

3

SiteDetails一般的な考え方は、各ノードを反復処理し、Siteノードの値を探している値と照合することです。

インスタンス$xmlとしてxmlが含まれていると仮定しますSimpleXML

$site = 'Canada';
$siteId = null;

foreach($xml->SiteDetails as $sd) {
  if(((string)$sd->Site) === $site) {
    $siteId = (int)$sd->SiteID;
    //break;
  }
}

var_dump($siteId); //int(2)

これがコードパッドでの実例です

xpath()を使用した解決策

これがを使用した解決策ですxpath()

$xml->registerXPathNamespace('ebay','urn:ebay:apis:eBLBaseComponents');
$site = 'Canada';
$siteId = $xml->xpath('ebay:SiteDetails/ebay:Site[text()="'.$site.'"]/../ebay:SiteID');
echo (string)$siteId[0]; //2

コードパッドでの作業例

説明:

  1. 最初に、要素の値を返すxpathの関数を使用して、値が「Canada」(またはのその他の値)のSiteDetails子ノードを持つノードを見つけます。Site$sitetext()
  2. 次に、 xpathセレクターSiteDetailsを使用して対応する父親に移動します。..
  3. 最後にSiteID、必要なSiteDetails要素からの値を抽出します。

頑張って=)

于 2012-07-05T11:20:36.120 に答える