我的目标是在不丢失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
交给它。 The documentation说Encoding.ASCII
。但是,如何告诉我希望它使用数字字符实体而不是其默认的有损行为呢?我已经测试过The encoding on the TextWriter determines the encoding that is written out
用所有正确的字符将期望的数据(没有XML声明)写为UTF-8,所以我知道doc.Save(Console.OpenStandardOutput())
包含我要序列化的信息。只是想出一种正确的方法告诉XML序列化程序我想要带字符实体的doc
...我知道编写同时具有
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/