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。