2013-03-19 123 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

相關問題