2

我的目标是在不丢失 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>“∞π”&lt;/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"- 通过将它交给一个TextStreamset TextStream.Encodingto Encoding.ASCII文档The encoding on the TextWriter determines the encoding that is written out。但是我怎么能告诉它我希望它使用数字字符实体而不是它的默认有损行为呢?我已经测试了doc.Save(Console.OpenStandardOutput())将预期数据(没有 XML 声明)写入所有正确字符的 UTF-8,所以我知道其中doc包含我希望序列化的信息。只需找出正确的方法来告诉 XML 序列化程序我想要encoding="us-ascii"的字符实体......</p>

我知道编写既encoding="us-ascii"支持又支持类似结构的XML 文档<π/>可能并非易事(我认为这可能仅适用于外部文档类型定义。是的,我只是为了好玩而尝试过。)。但我认为在 ASCII XML 文档中为非 ASCII 字符输出实体以支持在 Unicode 不友好的环境中保存内容属性值字符数据是很常见的。我认为表示 Unicode 字符的数字字符引用类似于使用 base64 来保护 blob,同时保持内容更具可读性。如何使用 .NET 执行此操作?

4

1 回答 1

5

您可以改用XmlWriter

  var doc = new XmlDocument();
    doc.LoadXml("<x>“∞π”&lt;/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> 
于 2014-03-14T02:58:05.957 回答