XPath多次在注释之间进行选择

时间:2014-10-16 12:23:26

标签: html xpath html-agility-pack

我们需要在HTML注释之间读取节点:

<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')]]

我正在使用带有以下代码的HTML Agility Pack:

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

string allHtml = nodes[0].OuterHtml;

如果我在上面的代码中将“评论1”更改为“评论2”,那么它不会给出任何结果。

1 个答案:

答案 0 :(得分:2)

添加一个谓词,表明您希望第一个前面的评论和第一个后面的评论。

因此,例如,要获取以&#34开头的评论之间的内容;评论1&#34;:

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

同样,要获取以&#34开头的评论之间的内容;评论2&#34;:

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