2010-06-24 113 views
5

我有一个程序从数据库中的数据中生成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> 

此xml文件不能被Firefox浏览器说无效字符开...

该实体在ISO 8859-1和CP1252保留,不应该被浏览器呈现。但是,为什么不能被解析为有效的XmlDocument输出XML - 抑或是只是不能被浏览器解析或Excel中导入等等... 有没有摆脱那个保留“的一个简单的方法是有效的XML文档无效字符'或编码他们的方式,浏览器没有问题呢?

你的意见非常感谢和TIPPS

+0

我已经有了与System.Data对象的各种XML方法完全相同的问题。我不确定这些方法会做什么。他们的选择是去除角色或抛出异常。 – 2011-11-15 14:56:20

回答

3

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

在XML 1.0,没有任何字符的具有小于0x20的值,可以使用除了TAB(0×09),LF(的0x0A)和CR(0X0D)。

在XML 1.1,只是除了NUL(0×00)什么都可以使用。

如果你必须使用XML 1.1,接收程序支持XML 1.1(不是很多做)的选项,那么你就可以逃脱0x1A的为&#26;&#x1A;

将其包装在CDATA也不是一个解决方案; CDATA只是一种方便的逃脱字符组,不同于标准的&机制。

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

+0

很抱歉回答这个老问题很晚 - 我在序列化之前删除了字符... Thx – 2010-10-28 08:55:42

0

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

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

+0

感谢您的tipp,但是我用ds.GetXml()得到的字符串在内部使用unicode(utf-16)我认为在写入文本文件而不改变编码时应该可以吗? – 2010-06-24 14:32:26

0

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

+0

hm google说iso8859-1及其超集cp1252的“保留未使用”可能是文件标记的结尾......但DB中的内容对我来说是黑匣子,因此我无法过滤输入到数据库的干净输入表... – 2010-06-24 14:21:18

1

从SQL数据创建/操作XML时,我已经遇到过几次了。

但是为什么不能被解析为有效的XmlDocument输出XML - 抑或是只是不能被浏览器解析或进口用Excel等

XmlDocument的没有按一个有效的XML文档”对您发送的数据执行任何验证,它会将其留给您(开发人员)。这个XML文档应该在使用XML几乎每一件事情是无效的(但我可能是错了......你总是可以测试它:P)

几乎每一个我已经打了这个问题的时候,我结束了使用用正确的字符(如果有的话)替换违规的XML数据,或者只是删除它。

你也可以尝试把你的XML CDATA块内,但将臃肿的文件一点点(不知道有多大整个文件会)

-1

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

+0

即使作为实体,“”,它仍然无效。 – 2012-09-07 16:11:33

+0

有两个问题。 1. XML和HTML实体是不同的东西。默认情况下,XML仅支持5个实体,其余的可以由DTD定义。 是一个HTML实体,而不是XML实体。因此将不能在XML中工作,您需要将其编写为。问题2.如上面的答案建议,非打印字符不能插入到XML中。所以你需要逃脱到&#21;在它被XML解析之前。 – 2012-10-01 01:54:06