2014-03-28 93 views
0
var cats = doc.DocumentNode.SelectNodes("xpath1 | xpath2"); 

我使用|運算符來計算多個節點,並且html agilitypack將它們放在一個包含所有結果的NodeCollection中,我如何知道Node是xpath1還是xpath2的結果?計算多個節點集

例如

var cats = doc.DocumentNode.SelectNodes("//*[contains(@name,'thename')]/../../div/ul/li/a | //*[contains(@name,'thename')]/../../div/ul/li/a/../div/ul/li/a"); 

我試圖從第一XPath返回第二個xpath返回單個或多個元件的單個元件構建樹狀結構中,第一XPath是一個主樹節點和所述第二XPath是該節點的孩子,我想根據結果的內部文本構建一個List<string,List<string>>

爲了使它更簡單考慮下面的HTML:

<ul> 
    <li> 
     <h1>Node1</h1> 
     <ul> 
     <li>Node1_1</li> 
     <li>Node1_2</li> 
     <li>Node1_3</li> 
     <li>Node1_4</li> 
     </ul> 
    </li> 
    <li> 
     <h1>Node2</h1> 
     <ul> 
     <li>Node2_1</li> 
     <li>Node2_2</li> 
     </ul> 
    </li> 
    <li> 
     <h1>Node3</h1> 
     <ul> 
     <li>Node3_1</li> 
     <li>Node3_2</li> 
     <li>Node3_3</li> 
     </ul> 
    </li> 
</ul> 

var cats = doc.DocumentNode.SelectNodes("//ul/li/h1 | //ul/li/ul/li") 

回答

1

爲什麼不只是做:

var head = doc.DocumentNode.SelectNodes("xpath1"); 
var children = head.SelectNodes("xpath2"); 

對於本例中的代碼,你會怎麼做:

var containerNodes = doc.DocumentNode.SelectNodes("//ul/li"); 
foreach(var n in containerNodes) 
{ 
    var headNode = n.SelectSingleNode("h1"); 
    var subNodes = n.SelectNodes("ul/li"); 
} 
+0

因爲xpath2得到xpath1的孩子,我想跟蹤chidren的,檢查HTML例子 – user1492051

+0

我更新我的回答佔兒童脫離頭部。他們是獨特的元素,你想知道他們是不同的元素。沒有理由組合xpaths並將它們放入一個查詢中。 –

+0

你不能這樣做與HtmlAgilityPack ... – user1492051