在PHP XPath Query中按名称空间获取HTML标记

时间:2011-04-05 12:57:57

标签: php xml dom xpath

假设我有以下HTML代码段:

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

如何为<div>设置了abc:section属性的每个{DOM}获取带有DOMNode的DOMNodeList(在PHP中)。

目前我有以下代码

$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函数将其转换为模板。

1 个答案:

答案 0 :(得分:1)

loadHTML方法会触发HTML Parser module of libxml。 Afaik,生成的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")]