2011-10-21 151 views
2

例如,我得到的HTML字符串像這裏面的文字:使用XPath獲取父節點

<p><br><a href=\"http://www.hello.com/en/\">www.hello.com</a></p> 

,我希望得到的結果是這樣的:

<br><a href=\"http://www.hello.com/en/\">www.hello.com</a> 

但我終於在使用XPath語句時獲得「www.hello.com」

//p/text() 

有什麼想法?

回答

1

使用此:

//p 

它wiil選擇p元素。

+0

結果仍爲「www.hello。com「與」// p「,我希望結果字符串中的
節點 – MaS

+0

@MaS,這取決於您在XPath引擎中如何使用它 –

+0

@MaS,'// p'將選擇任何p元素在文檔中 –

0
/p/* 

將檢索所有元素爲p的子元素。這就是你想要的。

警告。您的元素<br>結構不正確。你應該關閉它,因此它可以是一個很好形成空元素<br/>

+0

/p/node() return the the same result "www.hello.com" – MaS

+0

I don't know what XPath engine you are using. But if you do xmllint --xpath '/p/node()' file.xml - with file.xml containing your line - the ouptut is
www.hello.com。我在發佈前驗證它。 – Spredzy

+0

你如何運行XPath查詢? – Spredzy

1
But I finally get "www.hello.com" when using the the XPath statement 

    //p/text() 

這將選擇任何文本節點是文檔中的p元素的子元素。

但是,您不僅需要文本節點的子節點,還需要任何子節點,包括元素,如<br><a>

使用:

/p/node() 

當這個XPath表達式與提供的XML評價(校正爲進行良好的XML文檔):

<p><br/><a href="http://www.hello.com/en/">www.hello.com</a></p> 

選擇以下兩個節點

<br/><a href="http://www.hello.com/en/">www.hello.com</a> 

XSLT - 基於驗證

這種變換:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/p/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加:

<p><br/><a href="http://www.hello.com/en/">www.hello.com</a></p> 

將選定節點複製到輸出

<br/><a href="http://www.hello.com/en/">www.hello.com</a>