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

标签 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" —通过给它一个TextStreamTextStream.Encoding设置为 Encoding.ASCII . The 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 执行此操作?

最佳答案

您可以使用 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/

相关文章:

c# - 在 C# 的基类构造函数中覆盖和调用相同的方法

c# - 什么是代码优化?

c# - dapper:#tempDB 已创建但在下一个查询中不可用

android - 设计 View 中底部导航的实时 View 不显示图标和菜单资源

javascript - xml "<"解析错误

c# - 在 Azure Functions 中使用类

c# - 查询表达式无效 cosmosdb

C# 创建一个比较两个成员属性的 LambdaExpression(对于 EF Core HasQueryFilter)

c# - Entity Framework Code First 复合键上的一对一关系

java - 从 XML 中删除所有出现的特定属性