为什么这个DOMXpath查询合并兄弟节点值?

时间:2017-04-17 06:56:47

标签: php dom xpath

给出以下代码:

$html = "<h1>foo</h1><h2>bar</h2>";
$document = new DOMDocument();
$document->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($document);
$h1Nodes = $xpath->query('//h1');
foreach ($h1Nodes as $h1Node) {
    var_dump($h1Node->nodeValue);
}

H1标记仅包含文本“foo”的文本节点。文本'bar'位于兄弟标题节点(h2)中。我希望输出为'foo'。

然而,输出是“foobar”。

为什么?

1 个答案:

答案 0 :(得分:0)

感谢您的评论hardik solanki

它引出了我的答案:有效标记必须有一个根元素。

我提供的标记没有标记,我使用过的标记会阻止库隐式添加标记。所以第一个标签被视为根元素,结果有点令人困惑。

删除这些标志有助于解决此问题,但我将它们用于某个目的。我只是想操纵一段HTML,而不是整个文档。我希望通过调用DOMDocument::saveHTML()来获取此片段(在转换后)。没有doctype / <html> / <body>标记。

我结束了这样做:

  • 我将doctype / <html> / <body>标记添加到我想要操作的HTML代码段中以获得临时的有效文档
  • 使用DOMDocument
  • 加载它
  • 按我需要的方式改造
  • 使用DOMDocument::saveHTML()
  • 保存
  • 摆脱多余的doctype / <html> / <body>标记标记

有效。