ColdFusion: XmlParse не сохраняет возврат каретки - PullRequest
1 голос
/ 23 ноября 2010

test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<node>line1
line2
line3</node>

Код CF:

<cfset xmlfile = ExpandPath("test.xml")>
<cffile action="read" file="#xmlfile#" variable="xmlstring">
<cffile action="write" file="test1.xml" output="#xmlstring#">

<cfset xmldoc = XmlParse(xmlstring)> 
<cfset xmltext = ToString(xmldoc)>
<cffile action="write" file="test2.xml" output="#xmltext#">

Входной файл test.xml находится в формате CRLF, в кодировке UTF-8, 77 байтов. Первый выходной файл (test1.xml) находится в формате CRLF, в кодировке ANSI, 76 байтов. Второй выходной файл (test2.xml) имеет формат UNIX, кодированный ANSI, 71 байт.

Содержимое узла XML во входном файле: line1 Chr(13)Chr(10) line2 Chr(13)Chr(10) line3 (пробелы для удобства чтения). Содержимое узла XML в первом выходном файле такое же, как указано выше. Содержимое узла XML во втором выходном файле: line1 Chr(10) line2 Chr(10) line3.

Есть идеи, почему символ возврата каретки Chr(13) не сохранился после последовательности XmlParse/ToString?

UPDATE: Проблема заключается только в XmlParse. Это не о ToString или Cffile. Вот более актуальный пример - вы можете проверить сами:

<cfsavecontent variable="xmlvar">
<nodes>
    <node>
line1
line2
line3
    </node>
</nodes>
</cfsavecontent>

<cfset vtext = "#xmlvar#">
<cfset vtext = Replace(vtext,Chr(10),'LF','All')>
<cfset vtext = Replace(vtext,Chr(13),'CR','All')>
<cfdump var = "#vtext#">
<!--- outputs CRLF<nodes>CRLF <node>CRLFline1CRLFline2CRLFline3CRLF </node>CRLF</nodes>CRLF --->
<cfset xmldoc = XmlParse(xmlvar)>
<cfset vtext = "#xmldoc.nodes.node.XmlText#">
<cfset vtext = Replace(vtext,Chr(10),'LF','All')>
<cfset vtext = Replace(vtext,Chr(13),'CR','All')>
<cfdump var = "#vtext#">
<!--- outputs LFline1LFline2LFline3LF --->

Ответы [ 3 ]

0 голосов
/ 28 января 2011

Я не могу воспроизвести то, о чем вы говорите, с ColdFusion 9.0.1 на Mac OSX.Пробелы сохраняются так же, как и внутри. Я попробовал оба ваших примера выше, и они работали (в основном), как и ожидалось.На самом деле я не видел никаких CR в replace (), я видел только LF.Но это поддерживало их всех.

0 голосов
/ 02 февраля 2011

XML-парсеры нормализуют CR / LF и LF согласно spec Чтобы сохранить CR / LF EOL, используйте ссылки на сущности. Смотрите ниже:

<cfsavecontent variable="xmlvar">
<nodes>
    <node>
      line1&#x000D;&#x000A;
      line2&#x000D;&#x000A;
      line3&#x000D;&#x000A;
    </node>
</nodes>
</cfsavecontent>
0 голосов
/ 23 ноября 2010

Вы пытались использовать параметр charset = 'utf-8' в теге cffile?

...