2010-10-06 73 views
4

我有這樣的HTML/XML:的XPath選擇的innerText

\t\t\t\t\t \r\n\t\t 
<a href="/test.aspx"> 
    <span class=test> 
    <b>blabla</b> 
    </span> 
</a> 
<br/> 
this is the text I want 
<br/> 
<span class="test"> 
    <b>code: 123</b> 
</span> 
<br/> 
<span class="test"></span> 
\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t 

在C#4我用HtmlAgilityPack LIB來使用XPath選擇節點,並得到InnerText屬性。這將獲得節點內的所有文本。我怎樣才能得到文本「這是我想要的文本」?

/text()只返回\t\t\t\t\t \r\n\t\t

+0

@Alejandro:@peter後,他改變了問題的任擇議定書接受了答案 - 值得(OP)下調! – 2010-10-06 16:26:06

回答

10
/div/text() 

從給出的例子,這個XPath將讓你的所有文本節點的div元素的下面,在這種情況下TEST2。

如果你能詳細闡述這個問題,我們可能會更好地幫助你。該分區包含3個孩子:跨度元素,文本節點和b元素。 span和b每個都有一個文本節點子節點。使用XPath,您可以只選擇元素(/ div/*),僅文本節點(/ div/text())或所有節點類型(/ div/node())。

編輯:/ text()將只返回你根級別的文本節點。在這種情況下,我希望它返回一個包含3文本節點一個節點列表:

\t\t\t\t\t \r\n\t\t 
this is the text I want 
\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t 

你也許只有選擇的第一個節點中產生的節點列表? 有幾個問題的格式良好,如您的<br>應該可能是<br/>

+0

嗨,請看我的編輯。你有什麼想法爲什麼它不會返回所有文本? – peter 2010-10-06 13:44:14

+0

嗨,我使用SelectSingleNode,這就是爲什麼它只返回/ t/t/t/t/t。我應該使用SelectNodes ... doh。謝謝 – peter 2010-10-06 13:59:38

+0

沒有probs,很高興你有它的底部:) – 2010-10-06 14:07:41

0

我怎樣才能得到文本「這是我想要的 」?

text()[preceding-sibling::node()[1][self::br]] 
     [following-sibling::node()[1][self::br]] 

含義:2個br元件之間的文本節點。

1

@peter:你不應該編輯你的問題,以免人們看不到接受的答案與問題有什麼關係!

回答你的新問題:

/br[1]/following-sibling::text()[1] 

選擇想要的文本節點(引號是我的):

" 
this is the text I want 
" 
+0

+1這是更多架構相關的問題 – 2010-10-06 14:51:36

+0

有什麼問題嗎?我不是OP,我建議回答原始(模糊)問題。 OP用更完整的HTML片段更新了他的問題,我更新了我的答案(參見編輯部分)以涵蓋新的例子。最後,甚至沒有錯誤的XPath,但他選擇了一個節點(第一個來自列表)而不是C#中的整個節點列表 – 2010-10-06 15:02:36