0

xml ドキュメントを使用して、.NET でオンザフライでXmlDocumentを構築しています。次に、それをXslCompiledTransformのTransform()メソッドで変換します。

Transform() メソッドは、エンコーディングに対して無効な文字がストリームで見つかったため、例外をスローしました。Visual Studio の TextVisualizer を使用して文字列をコピーしてAltova XmlSpyに貼り付けると、エンコーディングの問題が見つかりません。

ドキュメントに UTF-16 ヘッダーを追加して UTF-16 としてレンダリングし、結果のテキストから Transform を呼び出して、BOM について不平を言うようにしました。以下は、私が使用したコードの簡略版です。

            XmlDocument document = new XmlDocument();
            XmlDeclaration decl = document.CreateXmlDeclaration("1.0", "UTF-16", null);
            document.AppendChild(decl);

            XmlNode root = document.CreateNode(XmlNodeType.Element, "RootNode", "");
            XmlNode nodeOne = document.CreateNode(XmlNodeType.Element, "FirstChild", null);
            XmlNode nodeTwp = doc.CreateNode(XmlNodeType.Element, "Second Child", null);

            root.AppendChild(nodeOne);
            root.AppendChild(nodeTwo);
            document.AppendChild(root);

その結果、次のように文字列に書き込んでいます。

        StringBuilder sbXml = new StringBuilder();
        using (XmlWriter wtr = XmlWriter.Create(sbXml))
        {
            xml.WriteTo(wtr);
            // More code that calls sbXml.ToString());
        }

BOM を追加したり、BOM を気にしないように XslCompiledTransform.Transform を取得するにはどうすればよいですか?

4

1 に答える 1

3

xml宣言を手動で追加する必要はありません。

このコードは、BOMと宣言を出力に追加します。

XmlDocument document = new XmlDocument(); 
// XmlDeclaration decl = document.CreateXmlDeclaration("1.0", "UTF-16", null); 
// document.AppendChild(decl); 
XmlNode root = document.CreateNode(XmlNodeType.Element, "RootNode", ""); 
XmlNode nodeOne = document.CreateNode(XmlNodeType.Element, "FirstChild", null);
XmlNode nodeTwo = document.CreateNode(XmlNodeType.Element, "SecondChild", null); 
root.AppendChild(nodeOne); 
root.AppendChild(nodeTwo); 
document.AppendChild(root);

using(MemoryStream ms = new MemoryStream())
{
    StreamWriter sw = new StreamWriter(ms, Encoding.Unicode);
    document.Save(sw);
    Console.Write(System.Text.Encoding.Unicode.GetString(ms.ToArray()));
}

byte []としての出力が必要な場合は、ms.ToArray()からの出力を使用できます。それ以外の場合は、適切なSystem.Text.Encodingエンコーディングを使用して、byte[]をさまざまなエンコーディングに変換できます。

于 2009-07-31T00:14:00.003 に答える