2010-11-23 5 views
1

test.xml:ColdFusion: XMLParse не сохраняет возврат каретки

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

ОБНОВЛЕНИЕ: Проблема заключается только в 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 ---> 
+0

Какая версия CF и ОС? – 2010-11-23 16:50:39

+0

CF 8, Windows XP Professional SP3 Также воспроизведено на CF 9. – dmr 2010-11-24 07:51:57

+0

Мне кажется, на основе небольшого поиска, что по умолчанию XML Parsers не должны сохранять пробелы, так как большая часть времени пробелов бессмысленно в данных и где это важно (в макете) встречается редко. Но похоже, что есть атрибут, который вы можете задать, чтобы синтаксический анализатор сохранял пробелы. Я понятия не имею, работает ли это в этом случае, потому что у меня не было проблем, которые вы описываете в моей системе. ref: http://www.w3.org/TR/REC-xml/#sec-white-space – 2011-01-28 11:08:31

ответ

0

XML Parsers нормализуют 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

Вы пробовали использовать параметр кодовую = «UTF-8» в cffile теге?

0

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