【问题标题】:illegal character in xml documentxml 文档中的非法字符
【发布时间】:2010-10-28 19:50:32
【问题描述】:

我有一个程序从数据库中的数据生成 Xml 文件。简而言之,它执行以下操作:

string dsn = "a db connection string";
XmlDocument d = new XmlDocument();
using (SqlConnection con = new SqlConnection(dsn)) {
    con.Open();
    string sql = "select id as Id, comment as Comment from Test where ... ";
    using (SqlCommand cmd = new SqlCommand(sql, con)) {
        DataSet ds = new DataSet("EXPORT");
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds, "Test");
        d.LoadXml(ds.GetXml());
    }
}
d.Save(@"c:\test.xml");

当我查看 xml 文件时,它包含无效字符 & # x 1 A ;

<EXPORT>
  <Test>
    <Id>2</Id>
    <Comment> Keyboard NB&#x1A;5 linked</Comment>
  </Test>
</EXPORT>

firefox 浏览器无法打开这个 xml 文件说无效字符...

该实体在 ISO 8859-1 和 CP1252 中保留,不应由浏览器呈现。但是为什么 XmlDocument 输出的 xml 不能被解析为有效 - 或者它是一个有效的 xml 文档,它不能被浏览器解析或被 Excel 导入等等...... 有没有一种简单的方法可以摆脱保留的“无效字符”或以浏览器没有问题的方式对其进行编码?

非常感谢您的意见和提示

【问题讨论】:

  • 对于 System.Data 对象的各种 XML 方法,我遇到了完全相同的问题。我不确定这些方法还能做什么。他们的替代方法是去掉字符或抛出异常。

标签: .net xml


【解决方案1】:

并非所有字符都可以在 XML 中表示。

在 XML 1.0 中,除 TAB (0x09)、LF (0x0A) 和 CR (0x0D) 之外,不能使用值小于 0x20 的任何字符。

在 XML 1.1 中,几乎可以使用除 NUL (0x00) 之外的任何内容。

如果您可以选择使用 XML 1.1,并且接收程序支持 XML 1.1(不是很多),那么您可以将 0x1A 转义为 &amp;#26;&amp;#x1A;

将其包装在CDATA 中也不是解决方案; CDATA 只是为了方便转义字符组,与标准 & 机制不同。

否则,您需要在序列化之前将其删除。

【讨论】:

  • 很抱歉回答这个老问题很晚 - 我在序列化之前删除了字符...... Thx
【解决方案2】:

我在从 SQL 数据创建/操作 XML 时遇到过几次。

但是为什么 XmlDocument 输出的 xml 不能被解析为有效 - 或者它是一个有效的 xml 文档,只是不能被浏览器解析或不能被 Excel 导入等等

XmlDocument 不对您发送的数据执行任何验证,而是将其留给您(开发人员)。这个 XML 文档在几乎所有使用 XML 的东西中都应该是无效的(但我可能错了......你总是可以测试它:P)

几乎每次我遇到这个问题时,我都会用正确的字符(如果有的话)替换有问题的 XML 数据,或者干脆去掉它。

您也可以尝试将您的 xml 放在 CData 块中,但这会使文件有点膨胀(不确定您的文件总体有多大)

【讨论】:

    【解决方案3】:

    看看这个xml parse error on illegal character

    结论(据我所知): 使用 XML 1.0 是不可能存储这个值的。

    【讨论】:

      【解决方案4】:

      看看这个答案是否有帮助:

      .NET DataSet.GetXml() - what's the default encoding?

      【讨论】:

      • 感谢您的提示,但我使用 ds.GetXml() 获得的字符串在内部是 unicode (utf-16) 我认为在不更改编码的情况下写入文本文件时,一切都应该没问题?
      【解决方案5】:

      我认为您正在处理 Control-Z(文本文件结尾)字符。这可能吗?

      【讨论】:

      • Hm google 对 iso8859-1 及其超集 cp1252 说“保留未使用”也许它是文件结束标记,...但是 DB 中的内容对我来说是黑匣子,所以我不可能过滤干净的输入到数据库表中...
      【解决方案6】:

      确保转义 XML 实体,例如。 &amp; =&gt; &amp;amp; 否则,将数据包装在 CDATA http://en.wikipedia.org/wiki/CDATA

      【讨论】:

      • 即使作为一个实体,&amp;#x1A;,依然无效。
      • 两个问题。 1. XML 和 HTML 实体是不同的东西。默认情况下,XML 仅支持 5 个实体,其余的可以由 DTD 定义。 是一个 HTML 实体,而不是一个 XML 实体。所以 不适用于 XML,您需要将其写为 。问题 2. 如上面的回答所建议的,不可打印的字符不能插入到 XML 中。所以你需要逃避类似 &#21;在被 XML 解析之前。
      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多