假设我有以下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函数将其转换为模板。
答案 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")]
。