【问题标题】:XPath selecting between comments multiple timesXPath 在评论之间多次选择
【发布时间】:2014-10-16 12:23:25
【问题描述】:

我们需要读取 HTML cmets 之间的节点:

<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 敏捷包:

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

string allHtml = nodes[0].OuterHtml;

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

【问题讨论】:

  • 请注意,您的 HTML Agility Pack 示例代码中的 XPath 包含您可能打算编辑掉的额外约束 ([contains(., 'InstanceEndEditable')]]) -- 它与您的示例不匹配。
  • 我回滚了您对源代码的更改,因为当您以这种方式重新排列源代码时,它完全改变了原始问题。在这里完成后,请随意提出一个新问题。谢谢。

标签: html xpath html-agility-pack


【解决方案1】:

添加一个谓词,表明您想要 first 前面的评论和 first 后面的评论。

因此,例如,要获取以“comment 1”开头的 cmets 之间的内容:

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

同样,要获取以“comment 2”开头的 cmets 之间的内容:

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

【讨论】:

  • 感谢您的回复。我现在已经更新了有问题的 html。是不是因为第二次错误地放置了“结束评论”标签?
  • 哇,我的回答适用于您提供的原始示例源。请先确认。另外,您的新更改(将 cmets 不再是兄弟姐妹)是实质性的,确实应该构成一个新问题。
  • 感谢您的回复,我已在原始问题本身中更新了不正确的 html。是的,我认为您的回答确实对我有所帮助。
  • 请注意,如果注释标记分隔非格式良好的 XML,则不能使用 XPath 获取注释标记之间的内容。
猜你喜欢
  • 2011-12-14
  • 2015-10-29
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多