In .NET, wie schreibe ich ein UTF-16 XMLDocument in einen String mit einem BOM
-
06-07-2019 - |
Frage
Ich baue eine XmlDocument auf die fliegen in .NET mit einem xML-Dokument. Ich verwandle dann, dass mit dem Transform () Methode eines XslCompiledTransform .
Die Transform () -Methode hat eine Ausnahme, weil ein ungültiges Zeichen für die Codierung im Stream gefunden wurde. Wenn die E / kopieren Sie die Zeichenfolge mit Hilfe des TextVisualizer einfügen in Visual Studio in Altova XMLSpy , es keine Codierung Problem.
habe ich versucht, in das Dokument eines UTF-16-Header hinzugefügt, um es als UTF-16 zu machen zu machen und aus dem resultierenden Text Trans calling führte dazu, über eine BOM beschweren. Im Folgenden finden Sie eine vereinfachte Version des Codes I verwendet wird.
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);
Was ich damit in einen String schreibe etwa so:
StringBuilder sbXml = new StringBuilder();
using (XmlWriter wtr = XmlWriter.Create(sbXml))
{
xml.WriteTo(wtr);
// More code that calls sbXml.ToString());
}
Was muss ich tun, um die Stückliste oder erhalten XslCompiledTransform.Transform hinzufügen nicht über die bom zu kümmern?
Lösung
Sie müssen nicht manuell, um die XML-Deklaration hinzuzufügen.
Dieser Code wird die Stückliste und die Deklaration mit dem Ausgang hinzuzufügen.
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()));
}
Wenn Sie die Ausgabe als byte [], dann können Sie die Ausgabe von ms.ToArray () verwenden. Ansonsten können Sie die entsprechende System.Text.Encoding Codierung verwenden, um die byte [] in eine Vielzahl von Kodierungen zu übersetzen.