我的目标是在不丢失 Unicode 字符的情况下获得 XML 的二进制缓冲区(在这种情况下 MemoryStream.ToArray()
将产生 byte[]
)。我希望 XML 序列化程序使用数字字符引用来表示任何在 ASCII 中无效的内容。到目前为止,我有:
using System;
using System.IO;
using System.Text;
using System.Xml;
class Program
{
static void Main(string[] args)
{
var doc = new XmlDocument();
doc.LoadXml("<x>“∞π”</x>");
using (var buf = new MemoryStream())
{
using (var writer = new StreamWriter(buf, Encoding.ASCII))
doc.Save(writer);
Console.Write(Encoding.ASCII.GetString(buf.ToArray()));
}
}
}
上述程序产生以下输出:
$ ./ConsoleApplication2.exe
<?xml version="1.0" encoding="us-ascii"?>
<x>????</x>
我想出了如何告诉 XmlDocument.Save()
使用 encoding="us-ascii"
—通过给它一个TextStream
与 TextStream.Encoding
设置为 Encoding.ASCII
. The documentation说The encoding on the TextWriter determines the encoding that is written out
.但是我如何告诉它我希望它使用数字字符实体而不是其默认的有损行为?我已经测试过 doc.Save(Console.OpenStandardOutput())
将预期数据(没有 XML 声明)写入具有所有正确字符的 UTF-8,所以我知道 doc
包含我希望序列化的信息。这只是找出告诉 XML 序列化器我想要的正确方法的问题 encoding="us-ascii"
与字符实体...
我知道编写同时为 encoding="us-ascii"
的 XML 文档可能并不简单并支持像 <π/>
这样的结构(我认为这可能只适用于外部文档类型定义。是的,I have tried just for fun。)。但我认为在 ASCII XML 文档中输出非 ASCII 字符的实体以支持在 Unicode 不友好的环境中保存内容 和属性值 字符数据是很常见的。我认为表示 Unicode 字符的数字字符引用类似于使用 base64 来保护 blob,同时保持内容更具可读性。我如何使用 .NET 执行此操作?
最佳答案
您可以使用 XmlWriter相反:
var doc = new XmlDocument();
doc.LoadXml("<x>“∞π”</x>");
using (var buf = new MemoryStream())
{
using (var writer = XmlWriter.Create(buf,
new XmlWriterSettings{Encoding= Encoding.ASCII}))
{
doc.Save(writer);
}
Console.Write(Encoding.ASCII.GetString(buf.ToArray()));
}
输出:
<?xml version="1.0" encoding="us-ascii"?><x>“∞π”</x>
关于c# - 我如何使用 XmlDocument.Save() 将 ="us-ascii"编码为数字字符实体而不是问号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22394441/