DOMXPath技术疑问:单节点名对应多nodeValue?root节点值含子节点内容?
关于DOMXPath中nodeValue的两个常见疑问解答
嘿,这两个问题其实都是DOM规范里nodeValue属性的常见“坑”,结合你给出的代码和输出,我来给你拆解清楚:
先看你的场景
你运行的PHP代码大概是这样(补全了缺失的部分):
<?php $xmldoc= '<?xml version="1.0" ?> <root> <text>Text value 11111</text> <none/> <empty>Empty text value 2222</empty> <space>space text value 3333 </space> </root>'; $dom = new DOMDocument(); $dom->loadXML($xmldoc); $xpath = new DOMXPath($dom); // 获取root节点并输出 $rootNode = $xpath->query('/root')->item(0); echo "父节点名称为{$rootNode->nodeName},其值为{$rootNode->nodeValue}\n"; // 获取space子节点并输出 $spaceNode = $xpath->query('/root/space')->item(0); echo "子节点为{$spaceNode->nodeName},其值为{$spaceNode->nodeValue}"; ?>
运行后得到的输出:
第一个echo输出:"父节点名称为root,其值为Text value 11111 Empty text value 2222 space text value 3333 "
第二个echo输出:"子节点为space,其值为space text value 3333"
问题1:为啥一个节点名对应多个值?
其实这不是“多个值”,而是DOM元素节点的nodeValue属性的特性:当你访问元素节点的nodeValue时,它会自动把这个节点下所有后代文本节点的内容拼接起来返回。
比如你的<root>节点下有<text>、<empty>、<space>这些带文本的子元素,每个子元素里的文本都是独立的文本节点。rootNode->nodeValue会忽略所有元素节点本身,只把这些文本节点的内容连在一起,所以看起来像是“多个值”,本质是所有文本内容的拼接结果。
问题2:为啥的nodeValue返回所有子节点内容?
这是DOM规范(以及PHP DOM扩展的实现)决定的:
- 对于元素节点(比如
<root>、<space>这种标签节点),nodeValue在PHP里的表现和textContent属性完全一致——递归遍历所有后代节点,提取所有文本内容并拼接。 - 只有文本节点(比如
<text>标签里的Text value 11111这个节点)的nodeValue才会返回自身的单一文本内容。
举个例子,如果你想单独获取<text>里的文本,得直接选中文本节点:
// 用XPath的text()表达式选中文本节点 $textNode = $xpath->query('/root/text/text()')->item(0); echo $textNode->nodeValue; // 只会输出:Text value 11111
简单总结
- 元素节点的
nodeValue(PHP中)= 所有后代文本内容的拼接版 - 要拿单个文本值?直接选中文本节点(用
text()或者定位到子文本节点)就行
内容的提问来源于stack exchange,提问作者user9718914
相关产品推荐
相关产品推荐

