ColdFusion: XMLPARSE не сохраняет возврат каретки
-
27-09-2019 - |
Вопрос
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
последовательность?
ОБНОВИТЬ:Проблема лежит только с 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 --->
Решение
XML Parsers нормализует CR / LF для LF на спецификация. Отказ Чтобы сохранить ссылки на объекты EOL CR / LF EOL. Смотри ниже:
<cfsavecontent variable="xmlvar">
<nodes>
<node>
line1

line2

line3

</node>
</nodes>
</cfsavecontent>
Другие советы
Вы пытались использовать параметр Charset = 'UTF-8' в теге cffile?
Я не могу воспроизвести все, о чем вы говорите с ColdFusion 9.0.1 на Mac OSX. Белое пространство сохраняется так же, как он идет. Я попробовал оба ваших примера выше, и они работали (в основном), как и ожидалось. Я на самом деле не видел никаких CRS в замене () S, я видел только LFS. Но это поддерживает их все.