解析匹配属性的XML父节点

时间:2013-11-01 02:32:57

标签: php xml xpath simplexml

我有一个类似下面的XML,我正在尝试执行xpath查询并使用simplexml解析它。 XML是CURL响应,存储在$response变量中。我需要查看Code中的<Item>属性,然后选择父<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");

这是我得到的通知:

  

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

1 个答案:

答案 0 :(得分:1)

一些观察结果:

  • xpath()方法返回SimpleXMLElement数组 对象,而不是单个SimpleXMLElement。 (是的,即使只有一个元素的父元素,你仍然必须将它作为数组的第一个成员([0])。
  • $scode->Items->Product->Price应该改为just $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

正如所料。