我的目标是在不丢失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 documentationEncoding.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>&#x201C;&#x221E;&#x3C0;&#x201D;</x>

关于c# - 如何使用数字字符实体而不是问号将XmlDocument.Save()编码为“us-ascii”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22394441/

10-17 02:33