节点内使用Xpath无法取值,document可行,节点列表取值求助
解决节点内部XPath无法取值但document对象可行的问题
这个问题我之前处理过,核心原因几乎都是XPath上下文节点的路径写法错误——当你遍历节点列表里的单个book1/book2这类节点时,很容易不小心用了基于整个文档的绝对路径,而非当前节点的相对路径,导致拿不到对应子节点的值。
问题拆解
你给出的XML结构里,每个bookN都是<book>的直接子节点,内部嵌套了<abc><fm>text</fm></abc>。当你用document对象能拿到值,是因为document的上下文是整个文档,而当你切换到单个bookN节点时,必须调整XPath的路径写法,限定搜索范围在当前节点的子树内。
错误写法示例(为什么不行)
如果你用了这种绝对路径,它会从整个文档根节点开始搜索,而不是从当前的bookN节点内部查找:
// 假设currentNode是节点列表中的某个bookN节点 const wrongValue = currentNode.evaluate('//abc/fm', currentNode, null, XPathResult.STRING_TYPE, null).stringValue;
这里的//abc/fm会遍历整个文档的所有abc/fm,而不是当前节点下的,自然不符合预期。
正确解决方案
根据你的XML结构,有两种可靠的写法:
直接子节点路径(如果
abc是bookN的直接子节点)
直接写出从当前节点出发的层级路径:const correctValue = currentNode.evaluate('abc/fm', currentNode, null, XPathResult.STRING_TYPE, null).stringValue;任意层级相对路径(如果不确定
abc的嵌套层级,或者结构可能变化)
用.表示当前节点上下文,再加上//搜索所有子层级:const correctValue = currentNode.evaluate('.//abc/fm', currentNode, null, XPathResult.STRING_TYPE, null).stringValue;
额外验证步骤
如果还是有问题,可以先确认你的节点列表是否正确:
- 遍历节点时,打印
currentNode.nodeName,确保拿到的是BOOK1/BOOK2这类元素节点(注意XML节点名通常是大写的) - 用
currentNode.querySelector('abc fm')测试,如果能拿到元素,说明节点本身没问题,只是XPath写法的问题
内容的提问来源于stack exchange,提问作者Gopi Lal
相关产品推荐
相关产品推荐

