2017-08-01 78 views
1

我試圖從通過的XPath下面的請求得到了價值的applicationID得到值: -XPath表達式從CDATA

<ApplicationStatusNotificationRequestMessage xmlns="http://schemas.co.za/application"> 
    <b>http://localhost/test/sonoras</b> 
    <c>POST</c> 
    <Data><![CDATA[{"applicationId":"12345678","status":"ACTIVATED"}]]></Data> 
</ApplicationStatusNotificationRequestMessage> 

我使用XPath表達式:

//app:ApplicationStatusNotificationRequestMessage/app:Data[@applicationId]/text() 

不幸的是, XPath沒有返回任何值。

+0

你有一個錯誤: POST – Borna

回答

2

<d>元素內的JSON內容僅爲text()節點。 JSON字符串中的「applicationId」不會被評估爲屬性。 CDATA被使用的事實是無關緊要的。

您的謂詞正在試圖從app:Data中選擇text(),這些元素有@applicationId,並且沒有。

使用contains()功能來限制元素具有在text()

//app:ApplicationStatusNotificationRequestMessage/ 
    app:Data[contains(., 'applicationId')]/text() 

JSON屬性如果你想獲得的applicationID值,則需要解析JSON字符串。有很多方法可以做到這一點。根據您使用的XPath版本,您將擁有更多/更少的選項。你會如何獲取價值的幾個例子:

的XPath 3.0 - 使用json-to-xml()

json-to-xml(//app:ApplicationStatusNotificationRequestMessage/ 
     app:Data[contains(., 'applicationId')]/text())/*/*[@key='applicationId']/text() 

的XPath 2.0 - 使用replace()

replace(//app:ApplicationStatusNotificationRequestMessage/ 
     app:Data[contains(., 'applicationId')]/text(), '.*applicationId.*?:.(\d+).,.*', '$1') 

的XPath 1.0 - 使用substring-before()substring-after()

substring-before(
    substring-after(//app:ApplicationStatusNotificationRequestMessage/ 
        app:Data[contains(., 'applicationId')]/text(), 
     'applicationId&quot;:&quot;'), 
    '&quot;,') 
+0

嗨。我按照你的建議實現了contains函數,但是我仍然得到以下輸出結果:{「applicationId」:「12345678」,「status」:「ACTIVATED」} –

+0

是的,選擇了Data元素中的文本。如果你只想要applicationId的數值,你需要解析它。你使用的是什麼版本的XPath? –

0

如果您不能註冊一個命名空間,你可以用這個去:

"/*[name()='ApplicationStatusNotificationRequestMessage']/*[name()='Data']" 
+0

嗨。我能夠添加一個名稱空間,但我無法獲得applicationId的值 –