2017-02-22 119 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,但存在這種可能性進行細化一般來說。