Java 如何解析CDATA?
如何查找并遍历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
)启动,由(
)关闭
另外,我应该如何迭代所有子节点并获得像下面的子节点中那样的值?我要检索该值
输入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><Network offering_id="13" transaction_id="2" submission_id="3" timestamp="20140828 16010683 GMT" customer_id="NETTest">
<Network_List>
<Network_Info att0="Y" att1="N" att2="N" att3="Y" att4="Y">
<SIM_DATA>
<SIM><![CDATA[1100040101]]></SIM>
</SIM_DATA>
<NetworkResponseInfo k_status="C">
<KEY1>269</KEY1>
<PARENTNODE>
<CHILDNODE1>
<KEY2>XXXXXXX</KEY2>
<KEY3>YYYYYYY</KEY3>
</CHILDNODE1>
<CHILDNODE2>
<KEY4>N</KEY4>
<KEY5>I</KEY5>
</CHILDNODE2>
<CHILDNODE3>
<KEY6>1</KEY6>
<KEY7>3</KEY7>
</CHILDNODE3>
</PARENTNODE>
<KEY8><![CDATA[some image not visible]]></KEY8>
<KEY9>N</KEY9>
<KEY10>15</KEY10>
</NetworkResponseInfo>
</Network_Info>
</Network_List>
<response_message_list transaction_status_code="000" transaction_status_text="Successful"/>
</Network></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><Network offering_id="13" transaction_id="2" submission_id="3" timestamp="20140828 16010683 GMT" customer_id="NETTest">
<Network_List>
<Network_Info att0="Y" att1="N" att2="N" att3="Y" att4="Y">
<SIM_DATA>
<SIM><![CDATA[1100040101]]></SIM>
</SIM_DATA>
<NetworkResponseInfo k_status="C">
<KEY1>269</KEY1>
<PARENTNODE>
<CHILDNODE1>
<KEY2>XXXXXXX</KEY2>
<KEY3>YYYYYYY</KEY3>
</CHILDNODE1>
<CHILDNODE2>
<KEY4>N</KEY4>
<KEY5>I</KEY5>
</CHILDNODE2>
<CHILDNODE3>
<KEY6>1</KEY6>
<KEY7>3</KEY7>
</CHILDNODE3>
</PARENTNODE>
<KEY8><![CDATA[some image not visible]]></KEY8>
<KEY9>N</KEY9>
<KEY10>15</KEY10>
</NetworkResponseInfo>
</Network_Info>
</Network_List>
<response_message_list transaction_status_code="000" transaction_status_text="Successful"/>
</Network></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内容并解析两者之间的值的示例都可以使选项列表详尽无遗,您应该添加使用字符串函数解析转义数据的选项。尽管它可能不吸引人、费力且容易出错,但它仍然是一种选择。有时是唯一的。