【问题标题】:xml files with same content differently parsed具有相同内容的 xml 文件被不同地解析
【发布时间】:2012-08-07 13:22:48
【问题描述】:

我有一个 xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<channel>
    <item>content with special character é</item>
</channel>

假设上面是 xml 文件,除了来自产品目录的内容,还有更多的标签和内容。这是使用以下过程创建的:

  1. 从冷融合文件调用数据库
  2. 从数据库中获取内容并返回coldfusion文件
  3. 在 Coldfusion 中创建一个 xml 文件(只需使用文件名,例如:“filename.xml”)
  4. 通过在coldfusion中循环查询并将每个产品的产品添加到xml文件中,将内容写入文件

当我尝试在 Firefox 中打开文件时,这给了我错误(我测试 xml 文件解析的方式)。告诉我我有一些需要转义的特殊字符(“xml 格式不正确”或类似的东西)。所以我将 CDATA 标签放在这些 xml 标签中,这应该可以清除它,对吧? 它没有。它总是在特殊字符上绊倒,而不仅仅是为 xml 保留的字符(&、、..)。

这是我开始失去它的时候。在手动创建较小的xml文件(不是通过coldfusion)进行一些尝试和测试之后,我只需删除CDATA标签并插入上面的代码就可以使用它。 Firefox 可以很好地解析上述代码。 所以经过一番思考,我只是将错误文件的全部内容(原始文件)复制到了一个全新的手动创建的 xml 文件(.txt --> 重命名为 .xml),瞧,没有更多错误了。

有人可以向我解释一下,在这种情况下,从第一个复制到第二个内容完全相同的 2 个单独文件如何得到不同的解析。第一个在特殊字符上显示多个错误,第二个对这些完全没有问题..? 拜托,有人,在我在这里发狂之前.. >_>

编辑 1: 当我说特殊字符时,我特指的是 utf-8 字符。我不是在谈论为 xml 保留的字符(&、、...),我已经将这些字符转义了。

【问题讨论】:

  • 创建文件的代码是什么样的?

标签: xml encoding coldfusion xml-parsing cdata


【解决方案1】:

您给出的示例中没有特殊字符,只是普通字符,如cé(我想空格有点特殊)等。

根据您的描述,我猜您使用的编码不正确。你说的是 UTF-8,但真的是这样吗?

如果这是问题所在,您有三个解决方案:

  1. 修复了以 UTF-8 格式写入文件的代码。
  2. 修复代码以描述其实际所处的编码(在 HTTP 标头和 XML 声明中都这样做)。
  3. 一直说它是 UTF-8,但转义 US-ASCII 范围(U+0000 到 U+007F)之外的任何字符。例如。您将以上内容输出为:

(添加此虚拟行是因为解析器似乎不喜欢列表后面的代码块)

<?xml version="1.0" encoding="UTF-8"?>
<channel>
    <item>content with special character &#xe9;</item>
</channel>

第一个是最好的选择,但如果做不到其他两个则有利有弊。支持数字 2,它不会转义尽可能多的不需要转义的字符。支持数字 3,只有 UTF-8 和 UTF-16 必须 被 XML 解析器接受,并且以这种方式伪造它适用于任何与 UTF-8 相同的字符集范围从 U+0000 到 U+007F,其中很多。

【讨论】:

  • 当我查看这两个文件的编码时,它说它们都是 utf-8。我试图明确告诉代码用 utf-8 编写,但没有成功。
  • 你完全正确。 Coldfusion 以 ANSI 编码创建了我的 xml 文件。如果将整个对象写入 ansi.xml 文件中,我的 xml 标头说内容是 utf-8 并不重要。谢谢!
【解决方案2】:

我使用 XmlFormat() 来格式化 xml 文件中的数据。也许这会解决你的问题。

<?xml version="1.0" encoding="UTF-8"?>
<channel>
    <item>#XmlFormat(field_from_database, true)#</item>
</channel>

【讨论】:

  • 试过了,但它只转义为 xml 保留的特殊字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2019-09-18
  • 2011-05-16
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多