为什么XPathselect上下文节点之外的节点?
我正在使用带有Node.js的XPath,并且我有下面的HTML文档,我想在其中select所有文章节点,然后在第二步中使用类"abc"
所有div:
<html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <article> <div>123456</div> <div class="abc">Hello0!</div> </article> <article> <div>123456</div> <div class="abc">Hello1!</div> </article> <article> <div>123456</div> <div class="abc">Hello2!</div> </article> <article> <div>123456</div> <div class="abc">Hello3!</div> </article> <article> <div>123456</div> <div class="abc">Hello4!</div> </article> <article> <div>123456</div> <div class="abc">Hello5!</div> </article> <article> <div>123456</div> <div class="abc">Hello6!</div> </article> <article> <div>123456</div> <div class="abc">Hello7!</div> </article> <article> <div>123456</div> <div class="abc">Hello8!</div> </article> <article> <div>123456</div> <div class="abc">Hello9!</div> </article> </body> </html>
我用下面的代码来select节点:
var xpath = require('xpath'); var DOMParser = require('xmldom').DOMParser; let parser: DOMParser = new DOMParser(); let doc = parser.parseFromString("HTML-document","text/xml"); let nodes: Node[] = xpath.select("//article", doc); console.log("NODES: ", nodes.length); let divs: Node[] = xpath.select("//div[@class='abc']", nodes[0]); console.log("DIVS: ", divs.length);
我的问题是,当检查两个控制台日志时,第一个说"NODES: 10"
。
到目前为止,我有十个文章节点。 但是,当我在十个文章节点中的第一个节点上再次select时,控制台显示"DIVS: 10"
。 所以XPath从一篇文章中select了所有的10个div,我预计只有一个div
。
我究竟做错了什么?
Andersson已经为您的问题 (+1)提供了正确的直接答案 ,但这里只是另一种select:您可以将两个XPath合并为一个:此XPath,
//article[0]/div[@class='abc']
将select相同的div
元素作为你的两个步骤的过程。
你甚至可以在path的任何一步更精细。 这个XPath将使用一个div
值为123456
的div
子元素在article
元素中select@class='abc'
的div
元素:
//article[div='123456']/div[@class='abc']
对于显示的特定XML文档, article
谓词select所有articles
,但这种细化的可能性一般存在。
你应该注意//
表示从页面元素开始的任何地方search,而.//
表示从当前节点开始search页面的任何地方。 所以,如果你想从已经find的article
元素开始search,你需要更换
"//div[@class='abc']"
同
".//div[@class='abc']"
要么
"./div[@class='abc']"
因为div
是article
的直接子