代码之家  ›  专栏  ›  技术社区  ›  CFML_Developer

字符实体转换为chr

  •  1
  • CFML_Developer  · 技术社区  · 6 年前

    我有一个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 回复  |  直到 6 年前
        1
  •  1
  •   Alex    6 年前

    如果你依赖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。