【发布时间】:2011-07-02 00:04:30
【问题描述】:
我没有找到一种明确的方法来选择 HTML 文件中两个锚点(<a></a> 标记对)之间存在的所有节点。
第一个锚点的格式如下:
<a href="file://START..."></a>
第二个锚点:
<a href="file://END..."></a>
我已经验证可以使用starts-with来选择两者(注意我使用的是HTML Agility Pack):
HtmlNode n0 = html.DocumentNode.SelectSingleNode("//a[starts-with(@href,'file://START')]"));
HtmlNode n1 = html.DocumentNode.SelectSingleNode("//a[starts-with(@href,'file://END')]"));
考虑到这一点,并凭借我业余的 XPath 技能,我编写了以下表达式来获取两个锚点之间的所有标签:
html.DocumentNode.SelectNodes("//*[not(following-sibling::a[starts-with(@href,'file://START0')]) and not (preceding-sibling::a[starts-with(@href,'file://END0')])]");
这似乎可行,但会选择所有 HTML 文档!
我需要,例如下面的 HTML 片段:
<html>
...
<a href="file://START0"></a>
<p>First nodes</p>
<p>First nodes
<span>X</span>
</p>
<p>First nodes</p>
<a href="file://END0"></a>
...
</html>
移除两个锚点,三个 P(当然包括内部 SPAN)。
有什么办法吗?
我不知道 XPath 2.0 是否提供了更好的方法来实现这一点。
*编辑(特殊情况!)*
我还应该处理以下情况:
"在 X 和 X' 之间选择标签,其中 X 是<p><a href="file://..."></a></p>"
所以而不是:
<a href="file://START..."></a>
<!-- xhtml to be extracted -->
<a href="file://END..."></a>
我也应该处理:
<p>
<a href="file://START..."></a>
</p>
<!-- xhtml to be extracted -->
<p>
<a href="file://END..."></a>
</p>
再次感谢您。
【问题讨论】:
-
好问题,+1。请参阅我对两个解决方案(XPath 1.0 和 XPath 2.0)的回答、解释以及使用 XSLT 作为 XPath 的宿主的验证。