我如何XmlDocument.Save()编码=" us-ascii"使用数字字符实体而不是问号?

时间:2014-03-14 01:29:21

标签: c# .net xml xmldocument xml-encoding

我的目标是在不丢失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.ASCIIThe documentationThe 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做到这一点?

1 个答案:

答案 0 :(得分:4)

您可以改为使用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>&#x201C;&#x221E;&#x3C0;&#x201D;</x>