2010-10-19 87 views
3

我試圖通過使用XPath查詢來解析XML節點中的字符串,該查詢要求我去掉子字符串並讀取其餘值。子字符串在獲得該值之前可能會有一個動態的空白空間,因此在XPath中使用某種indexOf函數會很有幫助。我試圖使用substring-after,但XPath是1.0的很好機會,根據this post可能會使這更難完成。以下是XML我試圖解析的例子:使用substring-after在XPath查詢中搜索文本

<root> 
    <myField>  StringToParse  7</myField> 
</root> 

我試圖獲得在字符串中的值7,這似乎可能與子,經過一番組合,規範空間。我不完全相信我正確地使用它,因爲不管我嘗試使用它的方式是什麼,結果都是空值或整個字符串,並且未刪除子字符串。

我能夠返回整個值(兩兩害取其輕)的方法是:

/myField[substring-after(.,'StringToParse')] 

這我希望將回到「7」任何人都可以讓我知道我做錯了與語法,還是有一個替代方法,我應該用來完成我想要的?

感謝,

邁克

+0

問得好,+1。請參閱我的答案,解釋您遇到的問題以及兩種解決方案。 – 2010-10-19 01:49:15

回答

4

我能夠返回整個 值(兩兩害取其輕)的方法是: /myField[substring-after(.,'StringToParse')], 我會希望將回到「7」 任何人都可以讓我知道我在做 錯誤

你接近,但也有至少兩個親用表達blems:

/myField[substring-after(.,'StringToParse')]

  1. myField不是文檔在頂部元件和該表達式請求將頂部元件被選擇並且該元素的名稱是myField。如果根據提供的XML文檔進行評估,則不會選擇節點,因爲所提供的XML文檔中的頂層元素名爲root

  2. substring-after()的函數調用在謂詞之內。這意味着將根據調用substring-after()的值調用名爲myField的頂層節點,並將其轉換爲布爾值。這顯然是你想要的 - 你不想要一個節點 - 你想要一個字符串!

substring-after(/*/myField, 'StringToParse') 

的計算結果爲(沒有引號):

"  7" 

更好的解決方案可以是

normalize-space(substring-after(/*/myField, 'StringToParse')) 

這個評估只是

"7" 
+0

這就是我想象的那樣工作,但是當我在任何一種在線XPath測試器中嘗試時,這都不起作用。它只是炸彈出來。在我的活動場景中,查詢結果爲空字符串(可能爲空值)這可能是XPath在.net中處理的結果,這是我用來評估查詢的平臺。我會做更多的測試並回復你。 – mclark1129 2010-10-19 02:07:11

+0

@Mike:那麼你沒有向我們展示真正的XML文檔。我懷疑它可能有一個默認名稱空間,這是一個衆所周知的答案最常見的問題。 – 2010-10-19 02:47:58

+0

真正的XML文檔基本上是一樣的,但是這個XPath並沒有在XSL中進行評估,實際上它是通過.net中的System.Xml.XmlNode.SelectSingleNode(string xPath)方法進行評估的。我懷疑這是問題的原因,因爲該方法返回一個XmlNode而不是一個字符串。當我在這裏使用Xpath查詢工具在這裏http://www.xmlme.com/XpathTool.aspx嘗試這樣做時,它在嘗試評估此表達式時給出的錯誤是「表達式必須評估爲節點集」 – mclark1129 2010-10-19 13:20:49