2010-10-06 204 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