的XmlSerializer忽略编码属性
问题描述:
是否有可能指示.NET的XmlSerializer的XML文档序列化格式如下:的XmlSerializer忽略编码属性
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "root.dtd">
<root>
...
</root>
即XML声明没有编码属性,文档类型,然后将文档的其余部分?
目前我有:
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());
}
但创建XmlWriterSettings对象因编码被空当.NET乱叫。有没有规范的方法,还是最简单的序列化为一个字符串,然后打电话给.Replace()
?
不幸的是,第三方供应商要求序列化字符串完全采用这种格式。
答
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类。« – knittl 2014-10-20 08:24:20
嘿,我真的不知道。也许这篇博文会帮助:http://www.cookcomputing.com/blog/archives/000577.html,它涉及覆盖一些类,看起来对我来说过分杀伤。 – pmatyszok 2014-10-20 08:46:26
我在单元测试中验证生成的字符串。有时我仍然可以获得编码属性。似乎有某种竞争条件(只有插入,如果我一起执行其他测试)。每次我序列化XML时,我都会创建一个新的'XmlTextWriter'实例。会发生什么? – knittl 2014-10-20 09:22:31