【问题标题】:XmlSerializer omit encoding attributeXmlSerializer 省略编码属性
【发布时间】:2014-10-20 07:00:24
【问题描述】:

是否可以指示 .NET 的 XmlSerializer 将 XML 文档序列化为以下格式:

<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "root.dtd">
<root>
...
</root>

即XML 声明没有编码属性、doctype 和文档的其余部分?

目前我有:

var bomlessUtf8Encoding = new UTF8Encoding(false);
var serializer = new XmlSerializer(typeof(T));
var namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);

using (var memoryStream = new MemoryStream())
using (var xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings { Indent = false, Encoding = null }))
{
    xmlWriter.WriteDocType(typeof(T).Name, null, ContentSerializer.MlpSvcInit320Dtd, null);
    serializer.Serialize(xmlWriter, input, namespaces);

    return bomlessUtf8Encoding.GetString(memoryStream.ToArray());
}

但由于 Encoding 为空,.NET 在创建 XmlWriterSettings 对象时会发出声音。有没有一种规范的方法,或者最简单的方法是简单地序列化为一个字符串,然后在其上调用.Replace()

很遗憾,第三方供应商要求序列化字符串完全采用这种格式。

【问题讨论】:

    标签: .net xml encoding


    【解决方案1】:

    XmlTextWriter 让您可以删除encoding 属性。如果传递null作为编码,xml会使用UTF-8编码,但encoding属性会被移除。

    所以是这样的:

    using(var xmlWriter = new XmlTextWriter(memoryStream, null))
    

    应该是合适的。也可以设置Indent等,参考http://msdn.microsoft.com/pl-pl/library/system.xml.xmltextwriter(v=vs.110).aspx

    【讨论】:

    • 谢谢!看起来它可以工作(尽管我必须手动调用WriteStartDocument())。有没有办法用XmlWriter 做到这一点? XmlTextWriter 的文档包含注释»从 .NET Framework 2.0 开始,我们建议您改用 System.Xml.XmlWriter 类。«
    • 嘿,我真的不知道。也许这篇博文会有所帮助:cookcomputing.com/blog/archives/000577.html,它涉及覆盖一些类,对我来说看起来有点矫枉过正。
    • 我在单元测试中验证生成的字符串。有时我仍然得到编码属性。似乎存在某种竞争条件(如果我一起执行其他测试,它只会被插入)。每次序列化 XML 时,我都会创建一个新的 XmlTextWriter 实例。会发生什么?
    • 抱歉,我不知道 - 我从没见过。
    • 似乎是虚惊一场。不知何故,nunit 一定已经掌握了以前构建的 dll。目前无法重现错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多