xml文档中的非法字符

时间:2010-06-24 13:42:24

标签: .net xml

我有一个程序,它从数据库中的数据生成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导入等等...... 是否有一种简单的方法可以摆脱保留的“无效字符”或以浏览器没有问题的方式对其进行编码?

非常感谢您的意见和提示

6 个答案:

答案 0 :(得分:3)

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

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

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

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

将其包裹在&#x1A;中也不是解决方案; CDATA只是方便转义字符组而不是标准&amp; -mechanism。

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

答案 1 :(得分:1)

在从SQL数据创建/操作XML时,我遇到过这种情况。

  

但是为什么XmlDocument输出无法解析为有效的xml - 或者它是一个无法由浏览器解析或由Excel导入的有效xml文档等等

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

几乎每次我遇到这个问题时,我最终都会使用正确的字符(如果有的话)替换有问题的XML数据,或者只是将其删除。

您也可以尝试将您的xml放入CData块中,但这样会使文件膨胀一点(不确定文件的整体大小)

答案 2 :(得分:1)

看看这个xml parse error on illegal character

结论(据我了解): 使用XML 1.0,无法存储此值。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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