2017-02-22 93 views
1

我使用的是Node.js的XPath和我有以下的HTML文档,在这里我想选择所有的文章节点,然后在第二个步骤中的所有的div​​类:为什么XPath选择上下文节点之外的节点?

<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> 

我用下面的代码选择节点:

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"

到目前为止,我有十个文章节点。但是,当我在十个文章节点中的第一个节点上再次选择时,控制台将显示"DIVS: 10"。所以XPath选择了一篇文章中的所有10个div,我预计只有一篇div

我在做什么错?

回答

1

您应该注意,//表示搜索从根元素开始的任何位置,而表示搜索从当前节点开始的任何位置。所以,如果你想开始搜索从已经找到article元素则需要更换

"//div[@class='abc']" 

".//div[@class='abc']" 

"./div[@class='abc']" 

divarticle

2
直接孩子安德森已经提供了

correct direct answer to your question(+1),但这里仅仅是另一种选择:您可以将两个XPath组合成一个:这个XPath,因为你的两个步骤的过程确实

//article[0]/div[@class='abc'] 

会选择相同的div元素。

你甚至可以在路径中的任何一步更详细。这个XPath将选择内article元素div元素与@class='abc'div的孩子,他的字符串值123456:显示

//article[div='123456']/div[@class='abc'] 

对于特定的XML文档,在article谓词选择所有articles,但存在这种可能性进行细化一般来说。