我的目标是获得一个二进制缓冲区(MemoryStream.ToArray()
会产生byte[]
在本例中)的 XML 且不会丢失 Unicode 字符。我希望 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()
to use encoding="us-ascii"
——通过给它一个TextStream
with TextStream.Encoding
set to Encoding.ASCII
. 文档 http://msdn.microsoft.com/en-us/library/sa5wd18z%28v=vs.110%29 says The encoding on the TextWriter determines the encoding that is written out
。但是我如何告诉它我希望它使用数字字符实体而不是默认的有损行为?我已经测试过了doc.Save(Console.OpenStandardOutput())
将预期数据(没有 XML 声明)写入为 UTF-8 并包含所有正确的字符,所以我知道doc
包含我想要序列化的信息。这只是找出告诉 XML 序列化器我想要的正确方法的问题encoding="us-ascii"
与字符实体...
我知道编写同时包含以下内容的 XML 文档可能并不简单encoding="us-ascii"
并支持像这样的结构<π/>
(我认为这可能只能通过外部文档类型定义来实现。是的,我只是为了好玩而尝试过 http://cdn.ohnopub.net/cdn/binki/xml_pi_elem/.)。但我认为在 ASCII XML 文档中输出非 ASCII 字符的实体以支持保存是很常见的。content and 属性值Unicode 不友好环境中的字符数据。我认为表示 Unicode 字符的数字字符引用类似于使用 base64 来保护 blob,同时保持内容更具可读性。如何使用 .NET 执行此操作?
您可以使用XmlWriter http://msdn.microsoft.com/en-us/library/ms162618%28v=vs.110%29.aspx反而:
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()));
}
Outputs:
<?xml version="1.0" encoding="us-ascii"?><x>“∞π”</x>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)