通过Xpath.C #HtmlAgilityPack拆分文本

时间:2013-05-15 14:16:30

标签: c# xpath html-agility-pack

我有一个带有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?

2 个答案:

答案 0 :(得分: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表达式首先递归地获取一个text()节点,该节点包含一个特定的&#39; DividerText:&#39;令牌,然后获得所有以下兄弟姐妹BR元素,而不是获取所有后续兄弟文本元素。

答案 1 :(得分:-1)

选择文档中的所有文本节点:

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

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

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

如果您需要直接使用某些文本,则需要XPath 2.0,此查询也会返回分隔符字符串后的部分,但需要XPath 1.0中不可用的substring-after函数:

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

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

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

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