utf-8エンコーディングを使用して作成されたXMLドキュメントがあります。そのドキュメントをsql2008xml列に保存したいのですが、そのためにはutf-16に変換する必要があることを理解しています。
XDocumentを使用してこれを実行しようとしましたが、変換後に有効なXML結果が得られません。これが私が変換を試みたものです(Utf8StringWriterはStringWriterから継承し、Encodingをオーバーロードする小さなクラスです):
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データは間違いなく有効であり、必要なすべての情報が含まれています。
更新:初期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ビューアで文字列リテラルが閉じられていませんというエラーが表示されます。