【问题标题】:Parse XML Parent node of matching attribute解析匹配属性的 XML 父节点
【发布时间】:2013-11-01 02:32:56
【问题描述】:

我有一个类似下面的 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");

这是我收到的通知:

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

【问题讨论】:

标签: php xml xpath simplexml


【解决方案1】:

几点观察:

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

如预期的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多