Dans .NET, comment puis-je écrire un XMLDocument UTF-16 dans une chaîne avec une nomenclature
-
06-07-2019 - |
Question
Je construis un XmlDocument sur le voler en .NET avec un document XML. Je le transforme ensuite avec le Transform () méthode d'une XslCompiledTransform .
La méthode Transform () a levé une exception car un caractère non valide pour le codage a été trouvé dans le flux. Lorsque je copie / colle la chaîne à l'aide de TextVisualizer dans Visual Studio dans Altova XmlSpy , il ne trouve pas de problème d'encodage.
J'ai essayé d'ajouter un en-tête UTF-16 au document pour le rendre au format UTF-16 et l'appel de Transform à partir du texte résultant l'a amené à se plaindre d'une nomenclature. Vous trouverez ci-dessous une version simplifiée du code que j'ai utilisé.
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);
Ce que j'écris par conséquent sur une chaîne comme celle-ci:
StringBuilder sbXml = new StringBuilder();
using (XmlWriter wtr = XmlWriter.Create(sbXml))
{
xml.WriteTo(wtr);
// More code that calls sbXml.ToString());
}
Que dois-je faire pour ajouter la nomenclature ou pour que XslCompiledTransform.Transform ne se soucie pas du nom de son enfant?
La solution
Vous n'avez pas besoin d'ajouter manuellement la déclaration xml.
Ce code ajoutera la nomenclature et la déclaration à la sortie.
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()));
}
Si vous avez besoin de la sortie sous forme d'octet [], vous pouvez utiliser la sortie de ms.ToArray (). Sinon, vous pouvez utiliser le codage System.Text.Encoding approprié pour traduire l'octet [] en une variété de codages.