尽管以UTF-8编写XML,但仍在XmlElement中转义Unicode字符串

本文关键字:XmlElement 转义 字符串 Unicode UTF-8 编写 XML | 更新日期: 2023-09-27 18:25:49

对于给定的XmlElement,我需要能够将内部文本设置为Unicode字符串的转义版本,尽管文档最终是用UTF-8编码的。有什么办法可以做到这一点吗?

这里有一个简单的代码版本:

const string text = "ñ";
var document = new XmlDocument {PreserveWhitespace = true};
var root = document.CreateElement("root");
root.InnerXml = text;
document.AppendChild(root);
var settings = new XmlWriterSettings {Encoding = Encoding.UTF8, OmitXmlDeclaration = true};
using (var stream = new FileStream("out.xml", FileMode.Create))
using (var writer = XmlWriter.Create(stream, settings))
    document.WriteTo(writer);

预期:

<root>&#xF1;</root>

实际:

<root>ñ</root>

直接使用XmlWriter并调用WriteRaw(text)是可行的,但我只能访问XmlDocument,序列化将在稍后进行。在XmlElement上,InnerText按预期将&转义为&amp;,并且设置Value会引发异常。

是否有某种方法可以将XmlElement的内部文本设置为转义ASCII文本,而不考虑最终使用的编码?我觉得我一定错过了一些显而易见的东西,或者这是不可能的。

尽管以UTF-8编写XML,但仍在XmlElement中转义Unicode字符串

如果您要求XmlWriter生成ASCII输出,它应该为所有非ASCII内容提供字符引用。

var settings = new XmlWriterSettings {Encoding = Encoding.ASCII, OmitXmlDeclaration = true};

输出仍然是有效的UTF-8,因为ASCII是UTF-8的一个子集。