【问题标题】:How can I parse CDATA?如何解析 CDATA?
【发布时间】:2014-10-24 13:45:53
【问题描述】:

如何查找和遍历 CDATA 下存在的所有节点,并且这些节点由 (<) 启动并由 (>) 关闭?

另外,我应该如何遍历所有子节点并获得如下子节点中的值?我想检索值。

输入 XML

    <SOURCE TransactionId="1" ProviderName="ABCDD"><RESPONSE><![CDATA[<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><NetworkResponse xmlns="http://www.example.com/"><NetworkResult>&lt;Network offering_id="13" transaction_id="2" submission_id="3" timestamp="20140828  16010683 GMT" customer_id="NETTest"&gt;
        &lt;Network_List&gt;
            &lt;Network_Info att0="Y" att1="N" att2="N" att3="Y" att4="Y"&gt;
            &lt;SIM_DATA&gt;
                    &lt;SIM&gt;&lt;![CDATA[1100040101]]&gt;&lt;/SIM&gt;
    &lt;/SIM_DATA&gt;
    &lt;NetworkResponseInfo k_status="C"&gt;
                    &lt;KEY1&gt;269&lt;/KEY1&gt;
                    &lt;PARENTNODE&gt;
                        &lt;CHILDNODE1&gt;
                            &lt;KEY2&gt;XXXXXXX&lt;/KEY2&gt;
                            &lt;KEY3&gt;YYYYYYY&lt;/KEY3&gt;
                        &lt;/CHILDNODE1&gt;
                        &lt;CHILDNODE2&gt;
                            &lt;KEY4&gt;N&lt;/KEY4&gt;
                            &lt;KEY5&gt;I&lt;/KEY5&gt;
                        &lt;/CHILDNODE2&gt;
                        &lt;CHILDNODE3&gt;
                            &lt;KEY6&gt;1&lt;/KEY6&gt;
                            &lt;KEY7&gt;3&lt;/KEY7&gt;
                        &lt;/CHILDNODE3&gt;
                    &lt;/PARENTNODE&gt;
                        &lt;KEY8&gt;&lt;![CDATA[some image not visible]]&gt;&lt;/KEY8&gt;
                        &lt;KEY9&gt;N&lt;/KEY9&gt;
                        &lt;KEY10&gt;15&lt;/KEY10&gt;
                &lt;/NetworkResponseInfo&gt;
            &lt;/Network_Info&gt;
        &lt;/Network_List&gt;
        &lt;response_message_list transaction_status_code="000" transaction_status_text="Successful"/&gt;
    &lt;/Network&gt;</NetworkResult></NetworkResponse></soap:Body></soap:Envelope>]]></RESPONSE></SOURCE>

输出 XML

                <ns3:NetworkResponse>
                            <Networks_OF_List>
                                <NetCharSeq>
                                    <Nrep>
                                        <type>Some Image</type>
                                        <data>  Data Coming from KEY8 CDATA section</data>
                                    </Nrep>
                                    <Nrep>
                                        <type>ANYTHING</type>
                                        <data>VALUE INSIDE SIM CDATA</data>
                                    </Nrep>
                                    <NetDetail>
                                        <MYKEY1>Value present inside KEY4</MYKEY1>
                                        <MYKEY2>Value present inside KEY5</MYKEY2>
                                    </NetDetail>
                                    <SystemID>Value of KEY2</SystemID>
                                    <SystemPath>Valuelue of KEY3</SystemPath>
                                </NetCharSeq>
                            </Networks_OF_List>
                        </ns3:NetworkResponse>

【问题讨论】:

  • 请展示您尝试过的操作。尝试搜索“parsing inside CDATA”,找到很多东西并尝试一下。
  • 个人建议:提取 CDATA 的内容并将它们写成正确的 XML,然后设置样式。
  • 解析 CDATA 内容并解析 < 之间的值的任何示例>

标签: java xml parsing xslt xpath


【解决方案1】:

(欢迎来到 SO。请注意,您被一些用户否决了,因为您没有展示您到目前为止所做的事情。查看How To Ask 部分以了解如何提出实际可以回答的问题和被认为是 SO 格式的正确问题。)

如果您可以使用 XSLT 3.0,您可以考虑使用新的 fn:parse-xml 函数,该函数将文档作为字符串。

但是,您的 CDATA 部分包含自己的转义数据,这意味着,在您应用 fn:parse-xml 后,您必须再次为 NetworkResult 的子文本节点执行此操作。

更好的解决方案通常是在源头解决此问题并创建一种 XML 格式,允许某些元素中包含其他 XML(您可以使用适当的 XSD 来允许)。它会为你省去很多麻烦,至少你的 XML 可以被预先验证。

如果您坚持使用 XSLT 2.0 或 1.0,您可以使用 disable-output-escaping(google 一下,有很多关于如何使用它的信息),但是您必须再次重新处理您的输出,因为使用的双重转义。您可能需要考虑使用XProc pipeline 来简化流程。

您写道:另外,我应该如何遍历所有子节点并获得如下子节点中的值

这就是 XSLT 的全部意义所在,请阅读此 XSLT Tutorial,或您能找到的任何其他教程,将在第一分钟向您解释。

更新:根据 cmets 中 michael.hor257k 的建议,您还可以使用字符串操作函数手动解析转义数据。正如他在 cmets 中已经说过的那样,这是费力且容易出错的,但有时,尤其是。如果转义后的 XML 不是真正的 XML,而是 like XML,那么这可能是您唯一的选择。

【讨论】:

  • 要使您的选项列表详尽无遗,您应该添加使用字符串函数解析转义数据的选项。尽管它可能没有吸引力、费力且容易出错,但它仍然是一种选择。有时只有一个。
猜你喜欢
  • 2015-09-07
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2021-12-15
  • 2021-01-21
  • 1970-01-01
相关资源
最近更新 更多