2014-10-20 68 views
0

是否有可能指示.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()

不幸的是,第三方供應商要求序列化字符串完全採用這種格式。

回答

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

+0

謝謝!它看起來像它的工作(雖然我不得不手動調用'WriteStartDocument()')。有沒有辦法用'XmlWriter'來做到這一點? 「XmlTextWriter」的文檔包含注意事項»從.NET Framework 2.0開始,我們建議您使用System.Xml.XmlWriter類。« – knittl 2014-10-20 08:24:20

+0

嘿,我真的不知道。也許這篇博文會幫助:http://www.cookcomputing.com/blog/archives/000577.html,它涉及覆蓋一些類,看起來對我來說過分殺傷。 – pmatyszok 2014-10-20 08:46:26

+0

我在單元測試中驗證生成的字符串。有時我仍然可以獲得編碼屬性。似乎有某種競爭條件(只有插入,如果我一起執行其他測試)。每次我序列化XML時,我都會創建一個新的'XmlTextWriter'實例。會發生什麼? – knittl 2014-10-20 09:22:31