.NETでは、BOMを使用してUTF-16 XMLDocumentを文字列に書き込むにはどうすればよいですか
-
06-07-2019 - |
質問
XmlDocument を構築していますxmlドキュメントを使用して.NETを起動します。次に、 Transform() XslCompiledTransform のメソッド。
エンコードに無効な文字がストリームで見つかったため、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を気にしないようにするにはどうすればよいですか?
解決
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 []をさまざまなエンコードに変換できます。
所属していません StackOverflow