Java 如何解析CDATA?

Java 如何解析CDATA?,java,xml,parsing,xslt,xpath,Java,Xml,Parsing,Xslt,Xpath,如何查找并遍历CDATA下的所有节点,这些节点由()启动,由()关闭 另外,我应该如何迭代所有子节点并获得像下面的子节点中那样的值?我要检索该值 输入XML <SOURCE TransactionId="1" ProviderName="ABCDD"><RESPONSE><![CDATA[<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w

如何查找并遍历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>
                <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>
networkoffering\u id=“13”transaction\u id=“2”submission\u id=“3”timestamp=“20140828 16010683 GMT”customer\u id=“NETTest”
网络列表
网络信息附件0=“Y”附件1=“N”附件2=“N”附件3=“Y”附件4=“Y”
模拟数据
SIM![CDATA[1100040101]]/SIM卡
/模拟数据
网络响应信息k_status=“C”
键1269/键1
父节点
儿童节1
键2xxxxxxx/键2
KEY3YYYYYYY/KEY3
/儿童节1
儿童节2
键4N/键4
键5i/键5
/儿童节2
儿童节3
键61/键6
键73/键7
/儿童节3
/父节点
键8![CDATA[某些图像不可见]]/KEY8
键9N/键9
键1015/键10
/网络响应信息
/网络信息
/网络列表
响应\u消息\u列表事务\u状态\u code=“000”事务\u状态\u text=“成功”/
/网络]]>
输出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>
                <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>

一些图像
来自KEY8 CDATA部分的数据
任何东西
SIM卡CDATA中的值
键4中存在的值
键5中存在的值
键2的值
键3的值
(欢迎参加SO。请注意,您被一些用户否决了,因为您没有展示您迄今为止所做的事情。请查看本节,了解如何提出实际可以回答的问题,以及SO格式中被认为是正确的问题。)

如果您可以使用XSLT 3,可以考虑使用新函数,该函数将使用文档AS-A字符串。

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

更好的解决方案通常是在源代码处修复此问题,并创建允许某些元素中使用其他XML的XML格式(您可以使用适当的XSD来允许)。这将为您节省很多麻烦,至少您可以对XML进行预验证

如果您一直使用XSLT 2.0或1.0,您可以使用
禁用输出转义
(google it,有很多关于如何使用它的信息),但是由于使用了双转义,您将不得不再次重新处理输出。你可能想考虑一个来缓解这个过程。

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

这就是XSLT的全部内容,请阅读本教程,或者您可以找到的任何其他教程,它将在第一分钟向您解释


更新:正如michael.hor257k在评论中所建议的,您还可以使用字符串操作函数手动解析转义数据。正如他在评论中所说的,这很费劲,而且容易出错,但有时尤其如此。如果XML不是真正意义上的XML,而是类似XML的东西,那么这可能是您唯一的选择。

请展示您尝试过的操作。尝试搜索“解析CDATA内部”,找到许多内容并尝试。个人建议:提取CDATA内容并将其作为适当的XML写出,然后设置样式。任何解析CDATA内容并解析两者之间的值的示例都可以使选项列表详尽无遗,您应该添加使用字符串函数解析转义数据的选项。尽管它可能不吸引人、费力且容易出错,但它仍然是一种选择。有时是唯一的。