2012-06-05 29 views
1

我有一個使用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查看器。

回答

2

的錯誤是在第一線XDocument xDoc = XDocument.Parse(utf8Xml);解析後。很可能您將utf8流轉換爲字符串(utf8xml),但字符串中指定的編碼仍然是utf-8,因此XML閱讀器失敗。如果它真的比使用Load直接從流中加載XML,而不是首先將其轉換爲字符串。

+0

感謝您的評論。實際上,我從另一個使用XMLSerializer創建XML的方法獲得了字符串,因此我無法訪問該流本身。 – dreza

+0

所以看看第一個字符 - 有可能是「encoding = ....」,如果它存在或設置爲與UTF-16不同的東西,那麼這裏是您的問題。我會嘗試在這種情況下使用XmlDocument.LoadXml ... –

+0

Excellant。這解決了它!非常感謝。 – dreza

2

設置文檔的編碼設置爲UTF-16已經從utf8xml

XDocument xDoc = XDocument.Parse(utf8Xml); 
xDoc.Declaration.Encoding = "utf-16"; 
StringWriter writer = new StringWriter(); 
XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings() 
       { Encoding = writer.Encoding, Indent = true }); 

xDoc.WriteTo(xml); 

string utf16Xml = writer.ToString(); 
+0

我只注意到我的例子中指定了錯誤的字符串編寫器。我的意思是隻使用StringWriter,因爲我希望utf-16中的XML不是utf-8。更新我的問題。 – dreza

+0

@dreza this line「xDoc.Declaration.Encoding =」utf-16「;」應該爲你做trcik然後:) – Faraday