【问题标题】:ColdFusion: XmlParse does not preserve Carriage ReturnColdFusion:XmlParse 不保留回车
【发布时间】:2010-11-23 16:33:34
【问题描述】:

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

任何想法为什么在XmlParse/ToString 序列之后没有保留回车符Chr(13)

更新: 问题仅在于 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 --->

【问题讨论】:

  • CF 8、Windows XP Professional SP3 也在 CF 9 上重现。
  • 在我看来,基于一些搜索,默认情况下 XML 解析器不希望保留空白,因为大多数时候空白在数据中是无意义的并且它很重要(在布局中) 很少见。但看起来您可以设置一个属性来告诉解析器保留空格。我不知道它是否适用于这种情况,因为我的系统上没有您描述的任何问题。参考:w3.org/TR/REC-xml/#sec-white-space

标签: coldfusion newline tostring carriage-return


【解决方案1】:

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>

【讨论】:

    【解决方案2】:

    你试过在cffile标签中使用参数charset='utf-8'吗?

    【讨论】:

      【解决方案3】:

      我无法在 Mac OSX 上使用 ColdFusion 9.0.1 重现您所说的任何内容。空白在进入时被保留。我尝试了上面的两个示例,它们(大部分)按预期工作。我实际上没有在 replace() 中看到任何 CR,我只看到了 LF。但它保持了所有这些。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2011-10-11
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多