为什么XML序列化器在字符位于CDATA内部时会抛出无效字符异常?

6
这会抛出一个ArgumentException异常:
可能是重复问题:
为什么XML中的"控制"字符是非法的?
在XML文件中保存转义字符0x1b

    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),情况也是如此。

你如何解决这个问题?


4
请看以下问题:在XML文件中保存转义字符0x1b为什么XML中的“控制”字符是非法的?。解决方法是在保存到XML之前使用Base64编码。 - oleksii
@oleksii 你应该把这个变成一个回答,因为这是正确的回复。 - Bevan
@Bevan:不,实际上这个问题应该被关闭为重复。 - John Saunders
2个回答

0

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

查看有效XML字符列表以获取更多详细信息。


-1

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

string xmlData = SecurityElement.Escape(xmlData);

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


那不起作用。即使使用SecurityElement.Escape,我仍然会得到一个关于字符\x1A的ArgumentException。 - Johnny Oshika
请问您能否展示一下您在上下文中如何使用它? - Dmitry Savy
1
无论如何,在XML中都不允许控制字符。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接