当字符在CDATA中时,为什么XML序列化程序会抛出无效字符异常?

时间:2012-02-27 23:42:59

标签: c# .net xml xml-serialization

  

可能重复:
  Why are “control” characters illegal in XML?
  Saving an escape character 0x1b in an XML file

抛出ArgumentException:

    var c = '\x1A';

    var xml = new XDocument(
                new XDeclaration("1.0", "utf-8", null),
                new XElement("test", new XCData(c.ToString()))
            );

    var foo = xml.ToString(); // ArgumentException

为什么.Net会抛出此异常?我把非法字符包裹在CDATA中,所以我原本以为我会处理非法字符。对于一堆其他字符(例如0x1B,0x1C,0x1E,0x1E,0x1F)也是如此。

你如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我不认为SecurityElement.Escape会起作用,因为\ x1A是一个控制代码 - 没有有效的xml实体可供替换。

有关详细信息,请参阅此list of valid XML characters

答案 1 :(得分:-1)

尝试使用System.Security命名空间中的SecurityElement将xml数据存储为转义数据。可以找到更多信息here

string xmlData = SecurityElement.Escape(xmlData);

可以通过使用设置为CheckCharacters属性设置为false的XmlWriterSettings创建XDocument来编写无效的XML字符。然后,这将用数字字符替换它们,例如& #0; - & #0x1F的。有关详细信息,请参阅this文章。另外,您可以调用一些清理xml方法,例如this one.