2014-10-16 94 views
1

我們需要HTML註釋之間讀取節點:的XPath選擇多次

<html> 
<!-- comment 1 --> 
<div>some text</div> 
<div><p>Some more elements</p></div> 
<!-- end content --> 

<!-- comment 2 --> 
<div>some text</div> 
<div><p>Some more elements</p> 
<!-- end content --> 
</div> 
</html> 

我嘗試使用下面的XPath:

//*[preceding-sibling::comment()[contains(., 'comment 1')]][following-sibling::comment()[contains(., 'end content')]] 

它工作正常的第一個評論即註釋1,但不針對第二條評論 以下是XPath的相同內容

//*[preceding-sibling::comment()[contains(., 'comment 2')]][following-sibling::comment()[contains(., 'end content')]] 

I我使用HTML敏捷性包與下面的代碼:

var nodes = document.SelectNodes("//*[preceding-sibling::comment()[contains(., 'comment 1')]][following-sibling::comment()[contains(., 'InstanceEndEditable')]]"); 

string allHtml = nodes[0].OuterHtml; 

如果我改變「註釋1」在上面的代碼「註釋2」,那麼它是不會放棄任何結果。

+0

請注意,您的HTML Agility Pack示例代碼中的XPath包含一個額外的約束('[contains(。,'InstanceEndEditable')]]'),您可能打算編輯 - 它與您的例。 – kjhughes 2014-10-16 13:25:00

+0

我回滾了源代碼的更改,因爲當您以該方式重新排列源代碼時,它完全更改了原始問題。完成後請隨時提出一個新問題。謝謝。 – kjhughes 2014-10-16 13:35:04

回答

2

添加,指出你想要的第一前面的註釋和第一如下評論斷言。

因此,舉例來說,要獲得與「註釋1」開頭的註釋的內容:

//*[preceding-sibling::comment()[1][contains(., 'comment 1')]] 
    [following-sibling::comment()[1][contains(., 'end content')]] 

同樣,獲得以「註釋2」開頭的註釋的內容:

//*[preceding-sibling::comment()[1][contains(., 'comment 2')]] 
    [following-sibling::comment()[1][contains(., 'end content')]] 
+0

感謝您的回覆。我已經更新了現在有問題的HTML。是否由於第二次放置「結束評論」標籤不正確? – Banng 2014-10-16 13:23:55

+0

Woa,我的答案適用於您提供的原始樣本源。請先確認一下。另外,你的新改變,你將評論轉移到不再是兄弟姐妹,是實質性的,真的應該構成一個新的問題。 – kjhughes 2014-10-16 13:31:23

+0

感謝您的回覆,我已更新原始問題本身的不正確的HTML。是的,我認爲你的回答對我有幫助。 – Banng 2014-10-16 13:34:23