【问题标题】:xpath failed to parse a SOAP response with CDATAxpath 无法解析带有 CDATA 的 SOAP 响应
【发布时间】:2015-01-07 10:22:18
【问题描述】:

我有一个采用这种格式的 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 中提取信息。如果是,如何?

【问题讨论】:

    标签: xml soap xpath


    【解决方案1】:

    尝试这样做:

    //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 中获取文本,但我无法使用 xpath 解析它? (例如获取变量 NOMBRE_P 的内容)
    • 我认为你必须先用字符串中的前一个 XPath 提取“sub-xml”,然后针对这个看起来是 XML 的字符串执行另一个 XPath
    • 谢谢,这是一个解决方案。但是可以在一个 xpath 命令中执行此操作。我的意思是在 //return/text() 的结果上应用 xpath 而不需要两次这样做?
    • 谢谢,我会接受你的回答,因为它是完整的,并会进一步寻找自己的自定义解决方案。
    【解决方案2】:

    这就是 CDATA 的意思。这意味着“这里的东西可能看起来像 XML,但不要被误导,我希望它被视为没有标记的字符数据”。这是对 XML 和 XPath 工具的一个指令,不要用 bargepole 触摸它。这是 CDATA 的唯一目的。如果您希望将内容视为 XML 并可供 XPath 表达式访问,则不要将其放在 CDATA 中。

    【讨论】:

    • 实际上,我正在从一个我无权进行这些更改的外部系统接收 SOAP 响应。
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多