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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top