首页 > 解决方案 > PHP XMLNode,DOMnode Xpath 选择谓词的孙属性值

问题描述

我有一些xml

<div> First Element
 <div>
  <level3 name="fred">
  </level3>
 </div>
</div>
<div> Second Element
 <div>
  <level3 name="dave">
  </level3>
 </div>
</div>
<div> Third Element
 <div>
  <level3 name="jim">
  </level3>
 </div>
</div>
<div> Fifth Element
 <div>
  <level3 name="mike">
  </level3>
 </div>
</div>

我想从一个特定的顶级 div 元素中提取 xml(作为一个字符串,包括 xml 标签),该元素基于其在 level3 的孙子名称。

因此,为了获得名为 jim 的 level3 节点上方的顶部 div,我一直在查看以下内容:

$sname="jim";
$spath = new DOMXPath($doc);
// Find a div with a child div with a level3 with a matching attribute name. 
$spexp = "//div[./div/level3[contains(@name,\"$sname\")]]";
$story = $spath->evaluate("$spexp");
echo $story->item(0)->nodeValue . "\n";

我尝试了各种组合 - 包括谓词中的“存在”,我确信它是基本的 xslt,但不是 PHP(!)。

我已经用谷歌搜索了负载...但是没有出现超过直接级别的谓词,而且似乎 PHP 的 xpath 有自己的风格,所以一般的 XPath 东西并不总是有用的。

标签: phpxmldomxpath

解决方案


XPath 没问题,这只是删除了第一个内部的第一个位,[因为它不需要。

要输出 XML,您还需要saveXML()与要导出所有 XML 标记的节点一起使用...

$sname="jim";
$spath = new DOMXPath($doc);
// Find a div with a child div with a level3 with a matching attribute name.
$spexp = "//div[div/level3[contains(@name,\"$sname\")]]";
$story = $spath->evaluate("$spexp");
echo $doc->saveXML($story->item(0)). "\n";

给...

<div> Third Element
 <div>
  <level3 name="jim">
  </level3>
 </div>
</div>

推荐阅读