我有一個使用utf-8編碼創建的XML文檔。我想將該文檔存儲在sql 2008 xml列中,但我知道我需要將其轉換爲utf-16才能完成此操作。將utf-8 XML文檔轉換爲utf-16以插入SQL
我試過使用XDocument來做到這一點,但轉換後我沒有得到有效的XML結果。這是我一直試圖做的轉換(Utf8StringWriter是一個小班,從StringWriter的繼承和過載編碼):
XDocument xDoc = XDocument.Parse(utf8Xml);
StringWriter writer = new StringWriter();
XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings()
{ Encoding = writer.Encoding, Indent = true });
xDoc.WriteTo(xml);
string utf16Xml = writer.ToString();
在utf16Xml的數據是無效的,並試圖插入到數據庫中,當我得到的錯誤:
{"XML parsing: line 1, character 38, unable to switch the encoding"}
但是初始utf8Xml數據肯定是有效的,並且包含我需要的所有信息。
UPDATE: 初始XML是通過使用XMLSerializer的(帶有Utf8StringWriter類)創建從現有的對象模型(發動機)XML字符串獲得。代碼爲:
public static void Serialise<T>(T engine, ref StringWriter writer)
{
XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings() { Encoding = writer.Encoding });
XmlSerializer xs = new XmlSerializer(engine.GetType());
xs.Serialize(xml, engine);
}
我不得不離開這個像這樣的代碼是我的控制改變。
之前,我甚至發utf16Xml串到發生故障的數據庫調用我可以通過Visual Studio調試器查看它,我注意到,整個字符串不存在,而是我得到一個字符串文字是不是在封閉錯誤XML查看器。
感謝您的評論。實際上,我從另一個使用XMLSerializer創建XML的方法獲得了字符串,因此我無法訪問該流本身。 – dreza
所以看看第一個字符 - 有可能是「encoding = ....」,如果它存在或設置爲與UTF-16不同的東西,那麼這裏是您的問題。我會嘗試在這種情況下使用XmlDocument.LoadXml ... –
Excellant。這解決了它!非常感謝。 – dreza