我有一个带有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?
答案 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()
等效项,您可能必须连接生成的集/数组。