XmlSerializer省略编码属性

时间:2014-10-20 07:00:24

标签: .net xml encoding

是否可以指示.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为null,.NET在创建XmlWriterSettings对象时咆哮。是否有规范的方法,或者最简单的方法是简单地序列化为字符串,然后在其上调用.Replace()

不幸的是,第三方供应商要求序列化字符串完全采用这种格式。

1 个答案:

答案 0 :(得分: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