字符实体转换为chr

时间:2018-11-14 17:21:00

标签: xml coldfusion coldfusion-2016

我有一个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&apos;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 &amp; 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时,我看到&apos;转换为'(撇号),而&amp;转换为&(与号)。如何防止实体丢失?

注意:我存储在cfsavecontent中的数据实际上来自数据库,对此我没有任何控制权。

1 个答案:

答案 0 :(得分:1)

如果您依靠ColdFusion的xmlParse,那么您可能就不走运了。参见以下示例:

<cfsavecontent variable="x">
    <node doubleQuote="&lt;, &amp;, &#x26;, &gt;, &quot;, &apos;" singleQuote='&lt;, &amp;, &#x26;, &gt;, &quot;, &apos;'>
        &lt;, &amp;, &#x26;, &gt;, &quot;, &apos;
    </node>
</cfsavecontent>

<cfset fileWrite(
    expandPath("test.xml"),
    xmlParse(x)
)>

输出为:

<?xml version="1.0" encoding="UTF-8"?>
<node doubleQuote="&lt;, &amp;, >, &quot;, '" singleQuote="&lt;, &amp;, >, &quot;, '">
    &lt;, &amp;, &amp;, &gt;, ", '
</node>

如您所见,解析器根据其“自己的”规则完全重新生成XML。所有属性都用双引号引起来,因此不再需要对属性值中的撇号进行编码,而只需使用双引号即可。在节点主体(.XmlText)中,根本不需要对撇号和双引号进行编码,因此未完成。同样,以前的实体使用HTML命名实体进行(重新)编码。从技术上讲,这是有效的XML,同时有点“ HTML4友好”(&apos;是HTML4中的未知实体)。

您将需要自己将整个XML文档重建为字符串形式,或者使用其他Java库来构建XML。