如何往返 "invalid XML characters" - 字符引用不是 valid/applicable 吗?

How to round-trip "invalid XML characters" - aren't character references valid/applicable?

以下两个代码示例演示了我遇到的这个问题,其中 "invalid characters" 未编码或解码。

var elm = new XElement("foo", "\x12")
elm.ToString();
// ArgumentException: '', hexadecimal value 0x12, is an invalid character.

同样,解析

var elm2 = XElement.Parse("<foo>&#x0012;</foo>");
// XmlException: '', hexadecimal value 0x12, is an invalid character ..

这是在意想不到的情况下导致意想不到的异常-

我怎样才能 "resolve" 使 XML 始终正确编码,无一例外?一般如何处理这个问题?

如果我必须在往返中保留这些"invalid characters",是否有一种标准的方法没有自定义编码(例如 base64)过程?

此外,我很惊讶地发现使用 XML 实体并没有解决问题 - 未编码? 这是 a difference between XML versions or merely some fundamental XML limitation?


在这种情况下,可以简单地删除无效的 XML 字符, 不希望为 手动执行操作每个 文本节点插入到 XElement 结构中。

这不是 XElement 唯一的问题,尽管答案可能取决于所使用的 XElement,因为在线验证站点在第二种情况下也会拒绝 XML。

无法制作包含无效字符的有效 XML 文档,对于 XML 1.0 大致为 0-31,对于 XML 1.1 仅为 0(但 System.Xml 支持此标准)。完整列表可以在规范或维基百科中找到 Valid characters in XML.

处理本质上是 "binary data" 的此类信息的推荐方法是对其进行 Base64 编码。