2009-07-30 11 views
0

xmlドキュメントで.NETでXmlDocumentをオンザフライで構築しています。私はXslCompiledTransformTransform()メソッドで変換します。.NETで、BOMを含む文字列にUTF-16 XMLDocumentを書くには

ストリームでエンコーディングに無効な文字が見つかったため、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を追加したり、XslCompiledTransform.Transformは、BOMを気にしないために得るために何をしなければなりませんか?

答えて

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 []をさまざまなエンコーディングに変換できます。

関連する問題