Сущность, преобразованная в chr - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть файл XML, иногда мне нужно продублировать этот XML, прочитав и заменив несколько его узлов различными значениями. Но после замены узлов другие несвязанные узлы преобразуют сущности обратно в символы. Например:

<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 голосов
/ 15 ноября 2018

Если вы полагаетесь на xmlParse ColdFusion, вам может не повезти здесь. Посмотрите этот пример:

<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.

...