2014-10-16 73 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