我有一个这种格式的 SOAP 响应:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:GetCampResponse xmlns:ns2="http://ws.ooredoo.com/">
<return><![CDATA[<GetSomething>
<NOMBRE_P>3</NOMBRE_P>
<CATEGORY>HV</CATEGORY>
<P_E>
<Sequence>1</Sequence>
<P_ID>101</P_ID>
<DESCRIPTION>some description</DESCRIPTION>
<DATE_DEB>07/01/2015</DATE_DEB>
<DATE_FIN>31/03/2015</DATE_FIN>
</P_E>
</GetSomething>]]></return>
</ns2:GetCampResponse>
</S:Body>
</S:Envelope>
我正在尝试使用以下命令从 CDATA 标签中提取信息,但失败了:
/S:Envelope/S:Body/*/return/<![CDATA[<GetCampaignforMSISDN>/NOMBRE_PROMO
/S:Envelope/S:Body/*/return/*/NOMBRE_PROMO
所以我想知道,xpath 是否支持从 CDATA 中提取信息。如果是,如何?
尝试这样做:
//return/text()
检查当存在某些子项时要选择 CDATA 内容的 xpath
在外壳中使用撒克逊棉绒的演示:
$ saxon-lint '//return/text()' /tmp/l.xml
<GetSomething>
<NOMBRE_P>3</NOMBRE_P>
<CATEGORY>HV</CATEGORY>
<P_E>
<Sequence>1</Sequence>
<P_ID>101</P_ID>
<DESCRIPTION>some description</DESCRIPTION>
<DATE_DEB>07/01/2015</DATE_DEB>
<DATE_FIN>31/03/2015</DATE_FIN>
</P_E>
</GetSomething>
然后:
$ saxon-lint '//return/text()' /tmp/l.xml > /tmp/ll.xml
然后:
$ cat /tmp/ll.xml
<GetSomething>
<NOMBRE_P>3</NOMBRE_P>
<CATEGORY>HV</CATEGORY>
<P_E>
<Sequence>1</Sequence>
<P_ID>101</P_ID>
<DESCRIPTION>some description</DESCRIPTION>
<DATE_DEB>07/01/2015</DATE_DEB>
<DATE_FIN>31/03/2015</DATE_FIN>
</P_E>
</GetSomething>
最后:
$ saxon-lint --xpath '//NOMBRE_P/text()' /tmp/ll.xml
3
这就是 CDATA 的意思。它的意思是"这里的东西可能看起来像XML,但不要被误导,我希望它被视为没有标记的字符数据"。这是对XML和XPath工具的指示,不要用驳船杆触摸它。这是 CDATA 的唯一目的。如果希望内容被视为 XML 并可供 XPath 表达式访问,请不要将其放在 CDATA 中。