【问题标题】:PHP - Get value of XML nodePHP - 获取 XML 节点的值
【发布时间】:2012-07-05 17:50:12
【问题描述】:

我有一个这样的 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>

我正在尝试找到一种方法来获取 SiteID 节点的值,其中 Site 节点等于任何值。

我尝试过使用 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);
}

有人可以帮忙吗?从上面可以看出,我很迷茫……

【问题讨论】:

  • 您能否澄清一下:您想从特定 SiteDetails 节点获取SiteID,其中Site 节点等于X?例如给定“加拿大”你想得到“2”?
  • 是的,就是这样。谢谢

标签: php xml xpath domdocument


【解决方案1】:

一般的想法是遍历每个 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)

Here is a working example on codepad

使用 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

working example in codepad

解释:

  1. 首先,我们使用 xpath 的 text() 函数返回元素的值,找到 SiteDetails 节点和子节点 Site 的值为“Canada”(或 $site 中的任何其他值)。
  2. 然后我们使用.. xpath选择器去对应的父亲SiteDetails
  3. 最后,我们从所需的SiteDetails 元素中提取SiteID 的值。

祝你好运=)

【讨论】:

  • 我尝试使用 Xpath 中的第二个选项,我得到“不能使用 DOMNodeList 类型的对象作为数组”错误,当我执行 var_dump 时,我得到一个空对象。这与我从上面的代码中得到的结果相同。我会尝试第一个选项。
  • @LeeTee 尝试使用SimpleXML而不是DOMNodeList,这应该可以。
猜你喜欢
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2016-10-09
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多