我有一个XML文件,有时我需要通过读取并用不同的值替换其中的几个节点来复制该XML。但是在替换节点后,其他不相关的节点会将实体转换回char。例如:
<cfsavecontent variable="wsXML">
<data>
<jobnumber>101</jobnumber>
<jobdesc>test desc</jobdesc>
<question>
<id>323</id>
<order>0</order>
<optional>false</optional>
<text>Were there multiple entities or named insured's?</text>
<type>MC</type>
<section>REM</section>
<basis>*</basis>
<audit>*</audit>
<min>0</min>
<max>0</max>
<options>
<string>There were no multiple entities.</string>
<string>There were multiple entities, shown & described separately.</string>
</options>
<answer>There were no multiple entities.</answer>
</question>
<question>
<id>324</id>
<order>1</order>
<optional>false</optional>
<text>Were there multiple locations?</text>
<type>YESNO</type>
<section>REM</section>
<basis>*</basis>
<audit>*</audit>
<min>0</min>
<max>0</max>
<options/>
<answer>No</answer>
</question>
</data>
</cfsavecontent>
<cfset DestPath = "C:\ColdFusion2016\cfusion\wwwroot\TestFiles">
<cfset JobData = XmlParse(wsXML)>
<!---assign the new auditid--->
<cfset JobData.data.jobNumber.xmlText = 100021>
<cfset JobData.data.jobdesc.xmlText = "">
<cffile action="write" file="#DestPath#/New100021.xml" output="#JobData#" charset="utf-8">
当我阅读New100021.xml时,我看到'
转换为'
(撇号),而&
转换为&
(与号)。如何防止实体丢失?
注意:我存储在cfsavecontent
中的数据实际上来自数据库,对此我没有任何控制权。
答案 0 :(得分:1)
如果您依靠ColdFusion的xmlParse
,那么您可能就不走运了。参见以下示例:
<cfsavecontent variable="x">
<node doubleQuote="<, &, &, >, ", '" singleQuote='<, &, &, >, ", ''>
<, &, &, >, ", '
</node>
</cfsavecontent>
<cfset fileWrite(
expandPath("test.xml"),
xmlParse(x)
)>
输出为:
<?xml version="1.0" encoding="UTF-8"?>
<node doubleQuote="<, &, >, ", '" singleQuote="<, &, >, ", '">
<, &, &, >, ", '
</node>
如您所见,解析器根据其“自己的”规则完全重新生成XML。所有属性都用双引号引起来,因此不再需要对属性值中的撇号进行编码,而只需使用双引号即可。在节点主体(.XmlText
)中,根本不需要对撇号和双引号进行编码,因此未完成。同样,以前的实体使用HTML命名实体进行(重新)编码。从技术上讲,这是有效的XML,同时有点“ HTML4友好”('
是HTML4中的未知实体)。
您将需要自己将整个XML文档重建为字符串形式,或者使用其他Java库来构建XML。