解析匹配属性的 XML 父节点


Parse XML Parent node of matching attribute

我有一个像下面这样的XML,我正在尝试进行xpath查询并使用simplexml解析它。XML 是 CURL 响应,存储在$response变量中。我需要在<Item>中查找 Code 属性并选择父<Product>来解析它。

$response

<Items>
 <Product>
  <Item Code="123">
  </Item>
  <Price>170
  </Price>
 </Product>
 <Product>
  <Item Code="456">
  </Item>
  <Price>150
  </Price>
 </Product>
</Items>

这就是我正在做的:

$xml = simplexml_import_dom($response); 
function loadNode($code){
    global $xml;
    $scode = $xml->xpath('//Item[contains(@Code,"' . $code . '")]/..');
    echo $scode->Items->Product->Price;
}
loadNode("123");

这是我收到的通知:

注意:尝试获取非对象的属性

几个观察结果:

  • xpath()方法返回一个数组SimpleXMLElement 对象,而不是单个SimpleXMLElement. (是的,即使一个元素只能有一个父元素,你仍然必须把它作为数组的第一个成员([0])。
  • $scode->Items->Product->Price应更改为仅 $scode->Price .

对 PHP 代码的这些修改:

<?php
$response = <<<XML
<Items>
  <Product>
    <Item Code="123">
    </Item>
    <Price>170
    </Price>
  </Product>
  <Product>
    <Item Code="456">
    </Item>
    <Price>150
    </Price>
  </Product>
</Items>
XML;
$xml = simplexml_load_string($response);
function loadNode($code) {
  global $xml;
  $scode = $xml->xpath('//Item[contains(@Code,' . $code . ')]/..')[0];
  echo $scode->Price;
}
loadNode("123");
?>

运行时将产生以下输出:

170

不出所料。