2013-03-19 82 views
3

我一直在努力解决过去几天中遇到的这个问题。说,我想从HTML文档中获取所有文本(),但我只想知道和检索包含文本数据的节点的XPath。例如:使用XPath选择包含文本的所有节点

foreach (var textNode in node.SelectNodes(".//text()")) 
//do stuff here 

然而,当涉及到使用textNode.XPath检索textNode的XPath中,我得到了充分的XPath包括#text节点:

/html[1]/body[1]/div[1]/a[1]/#text

但我只想要含节点文本,例如:

/html[1]/body[1]/div[1]/a[1]

任何人都可以指向一个更好的XPath解决方案来检索包含文本的所有节点,但只能检索XPath直到包含节点?

回答

2

你为什么不

string[] elements = getXPath(textNode).Split(new char[1] { '/' }); 
return String.Join("/", elements, 0, elements.Length-2); 
+0

我想过拆分XPath,然后删除#text节点。这可能是最好的解决方案,但我仍然想看看是否可以通过使用XPath来解决这个问题。如果到今天为止我还没有想出使用XPath的解决方案,那么将此答案标记为已回答。 – 2013-03-20 11:11:48

+0

我使用第一行,但它给出了无法找到getXPath的错误。哪个命名空间包含getXPath? – user585440 2016-01-10 05:36:03

+0

@ user585440对不起,我不记得这个函数是如何工作的,但它看起来取决于你的环境。它似乎返回包含给定'textNode'的String对象的内容。我相信你可以在官方的.NET文档中找到类似的功能。 – 2016-01-11 17:06:58

3

而不是

.//text() 

使用

.//*[normalize-space(text())] 

这将选择所有的 “叶元素” 的-descendants上下文(当前)节点至少有一个非空白文本节点子节点。

+0

尽管该XPath按预期工作(返回继续的文本节点),但我仍然遇到一些怪异现象。 例如: 之所以这样说,是我们要找回所有的文本数据的从节点: ''

This is a test link
使用'.//文本()'将返回 '这是了' | 'test' | 'link' 虽然'.//* [normalize-space(text())]'正在返回: 'This is a test link' | '这是一个' | 'test' | '链接' – 2013-03-20 11:15:25

+0

@DanielClark,XPath表达式不“返回” - 他们“选择”。你看到“古怪”的表达根本不选择任何文本节点 - 它选择文本节点的父节点(元素)。您然后*必须*获取任何此类元素的每个单独的文本节点子元素。你在做什么,而不是(这是为“古怪”的原因)是获取父的字符串值 - 这是它的所有文本节点后代的串联。 – 2013-03-20 15:30:50

+0

啊,对我的错误,你是对的。无论哪种方式,我已成功地废除结合您发布的建议的表达,然后拆分结果数据的文本数据通过@伊利亚 - khaustov的建议 – 2013-03-20 19:42:35

相关问题