En .NET, ¿cómo escribo un documento XML UTF-16 en una cadena con una lista de materiales?
-
06-07-2019 - |
Pregunta
Estoy construyendo un XmlDocument en el vuela en .NET con un documento xml. Luego lo transformo con el Transform () de un XslCompiledTransform .
El método Transform () arrojó una excepción porque se encontró un carácter no válido para la codificación en la secuencia. Cuando copio / pego la cadena con la ayuda de TextVisualizer en Visual Studio en Altova XmlSpy , no encuentra un problema de codificación.
Intenté agregar un encabezado UTF-16 al documento para que se procesara como UTF-16 y llamar a Transformar desde el texto resultante me llevó a quejarme de una lista de materiales. A continuación se muestra una versión simplificada del código que utilicé.
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);
Que, por consiguiente, estoy escribiendo en una cadena como esta:
StringBuilder sbXml = new StringBuilder();
using (XmlWriter wtr = XmlWriter.Create(sbXml))
{
xml.WriteTo(wtr);
// More code that calls sbXml.ToString());
}
¿Qué debo hacer para agregar la lista de materiales u obtener XslCompiledTransform.Transform para que no me importe el bom?
Solución
No necesita agregar manualmente la declaración xml.
Este código agregará la lista de materiales y la declaración a la salida.
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 necesita la salida como un byte [], puede usar la salida de ms.ToArray (). De lo contrario, puede usar la codificación adecuada System.Text.Encoding para traducir el byte [] en una variedad de codificaciones.