0

我有一个带有 InnerHtml 的 HtmlNode:

<a>SomeText</a>
DividerText:
<br>
TextToSelect1
<br/>
TextToSelect2
<br/>
TextToSelect3
<br>
TextToSelect4

是否可以仅通过 XPath 选择所有“TextToSelect”而无需 c# Split 或 Regex?

像这样:/text()/substring-after('DividerText:')

或者我怎样才能获得不包括标签 a 的 InnerHtml?

4

2 回答 2

1

您可以像这样(在示例控制台应用程序中)获取 DividerText 之后跟随 BR 的所有文本:

  HtmlDocument doc = new HtmlDocument();
  doc.Load(MyTestHtm);

  foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[contains(., 'DividerText:')]/following-sibling::br/following-sibling::text()"))
  {
      Console.WriteLine(node.InnerText.Trim());
  }

将其转储:

TextToSelect1
TextToSelect2
TextToSelect3
TextToSelect4

XPATH 表达式首先递归获取包含特定“DividerText:”标记的 text() 节点,然后获取所有后续兄弟 BR 元素,然后获取所有后续兄弟文本元素。

于 2013-05-15T14:53:30.247 回答
-1

要选择文档中以下所有文本节点:

//text()[contains(., 'DividerText:')]//following::text()

选择所有同级文本节点(在包装元素内的同一级别上:

//text()[contains(., 'DividerText:')]//following-sibling::text()

如果后面直接需要一些文本,则需要 XPath 2.0,此查询还返回分隔符字符串之后的部分,但需要substring-afterXPath 1.0 中没有的功能:

//text()[contains(., 'DividerText:')]//(substring-after(., 'DividerText:'), following::text()/data())

如果您能够使用 XPath 2.0 或更新版本,实际上有一个substring-after方法:

substring-after(string-join(//text()), 'DividerText:')

您还可以//text()用来获取所有文本节点,然后substring-after()在 C# 中使用一些等效的,您可能必须连接结果集/数组。

于 2013-05-15T14:54:49.760 回答