xpath 无法解析带有 CDATA 的 SOAP 响应
xpath failed to parse a SOAP response with CDATA
我有一个格式如下的 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()
勾选what xpath to select CDATA content when some childs exist
在 shell 中使用 saxon-lint 的演示:
$ 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的意思。意思是"the stuff in here might look like XML but don't be misled, I want it treated as character data without markup"。这是对 XML 和 XPath 工具的指示,不要用 bargepole 触摸它。这是 CDATA 的唯一目的。如果您希望将内容视为 XML 并可由 XPath 表达式访问,则不要将其放入 CDATA。
我有一个格式如下的 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()
勾选what xpath to select CDATA content when some childs exist
在 shell 中使用 saxon-lint 的演示:
$ 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的意思。意思是"the stuff in here might look like XML but don't be misled, I want it treated as character data without markup"。这是对 XML 和 XPath 工具的指示,不要用 bargepole 触摸它。这是 CDATA 的唯一目的。如果您希望将内容视为 XML 并可由 XPath 表达式访问,则不要将其放入 CDATA。