2010-11-23 60 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)採用ANSI編碼的CRLF格式,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

任何想法,爲什麼在XmlParse/ToString序列後沒有保留回車符Chr(13)

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 ---> 
+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解析器根據spec將CR/LF標準化爲LF。保持CR/LF EOL使用實體引用。見下:

<cfsavecontent variable="xmlvar"> 
<nodes> 
    <node> 
     line1&#x000D;&#x000A; 
     line2&#x000D;&#x000A; 
     line3&#x000D;&#x000A; 
    </node> 
</nodes> 
</cfsavecontent> 
0

您是否嘗試過在CFFILE標籤使用參數的charset =「utf-8」?

0

我無法重現您在Mac OSX上使用ColdFusion 9.0.1討論的任何內容。白色空間正在被保留下來,我嘗試了上面的兩個例子,他們按預期工作(大部分)。我其實並沒有在replace()中看到任何CR,我只看到了LF。但它保持了所有。