1

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ビューアで文字列リテラルが閉じられていませんというエラーが表示されます。

4

3 に答える 3

2

utf8xmlからドキュメントを解析した後、ドキュメントのエンコーディングをUTF-16に設定します

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();
于 2012-06-05T01:30:04.860 に答える
2

エラーは最初の行にありXDocument xDoc = XDocument.Parse(utf8Xml);ます。ほとんどの場合、utf8 ストリームを文字列 (utf8xml) に変換しましたが、文字列で指定されたエンコーディングは依然として utf-8 であるため、XML リーダーは失敗します。true の場合は、XML を最初に文字列に変換するのではなく、Loadを使用してストリームから直接ロードします。

于 2012-06-05T01:52:54.283 に答える