如何通过XPath在HTML元素中获取注释?

问题描述 投票:0回答:1

我想在HTML元素中获取注释,但是显然,注释不在DOM元素的层次结构中。

例如,

<!-- FIRST -->
<div id="parent">
<!-- SECOND -->
    <span id="child">
<!-- THIRD -->
    </span
</div>

[使用$xpath->query的第二个参数时无效。

$comments=$xpath->query('//comment()');
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}

// Query (intended) within <div id="parent">
$el = $doc->getElementById('parent');

$comments=$xpath->query('//comment()',$el);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}

// Query (intended) within <div id="child">
$el = $doc->getElementById('child');

$comments=$xpath->query('//comment()',$el);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}

并且所有三个循环的输出都相同,

 FIRST 
 SECOND 
 THIRD 
 FIRST 
 SECOND 
 THIRD 
 FIRST 
 SECOND 
 THIRD 
php dom xpath
1个回答
1
投票

必须相对于给定的上下文节点选择注释。

xpath表达式中的//(后代或自身)前缀正在选择节点中任何位置的每个注释,而与上下文无关。

我建议使用.//(自身,后代或自身)xpath表达式进行相对搜索,以在提供的上下文中进行搜索。

例如,

<?php
$xml = <<< XML
<!-- FIRST -->
<div id="parent">
<!-- SECOND -->
    <span id="child">
<!-- THIRD -->
    </span>
</div>
XML;

$dom = new DOMDocument;
$dom->loadHTML($xml);
$xpath = new DOMXpath($dom);

文档中的所有注释

<?php
$comments = $xpath->query('.//comment()', $dom);
foreach($comments as $comment){
    echo $comment->nodeValue.PHP_EOL;
}
 FIRST
 SECOND
 THIRD

[div#parent中的所有注释

<?php
$el = $dom->getElementById('parent');
$comments = $xpath->query('.//comment()', $el);
foreach($comments as $comment){
    echo $comment->nodeValue.PHP_EOL;
}
 SECOND
 THIRD

[span#child中的所有注释

<?php
$el = $dom->getElementById('child');
$comments = $xpath->query('.//comment()', $el);
foreach($comments as $comment){
    echo $comment->nodeValue.PHP_EOL;
}
 THIRD
© www.soinside.com 2019 - 2024. All rights reserved.