繁体   English   中英

在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>

如何为设置了abc:section属性的每个<div>的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函数对其进行转换,并将其提供给模板。

loadHTML方法将触发libxmlHTML Parser模块 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")]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM