在PHP XPath查询中按名称空间获取html标记


Get HTML-tags by namespace in PHP XPath Query

假设我有以下HTML片段:

<div abc:section="section1">
  <p>Content...</p>
</div>
<div abc:section="section2">
  <p>Another section</p>
</div>

我怎么能得到一个DOMNodeList(在PHP中)与一个DOMNode为每个<div> 's与abc:section属性集。

目前我有以下代码

$dom = new DOMDocument();
$dom->loadHTML($html)
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('abc', 'http://xml.example.com/AbcDocument');

下面的XPath不能工作:

$xpath->query('//@abc:section');
$xpath->query('//*[@abc:section]');

加载的HTML始终只是一个片段,我正在使用DOMDocument函数转换它并将其提供给模板。

loadHTML方法将触发libxml的HTML Parser模块。很显然,生成的HTML树不包含名称空间,所以在这里用XPath查询它们是行不通的。你可以做

$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXPath($dom);
foreach ($dom->getElementsByTagName('div') as $node) {
    echo $node->getAttribute('abc:section');
}
echo $dom->saveHTML();

作为一种替代方法,您可以使用//div/@*来获取所有属性,其中包括名称空间属性。你不能在查询中使用冒号,因为这需要注册命名空间前缀,但就像上面指出的那样,这对HTML树不起作用。

另一种选择是使用//@*[starts-with(name(), "abc:section")]