Pregunta

Al cargar XML en un XmlDocument, es decir,

XmlDocument document = new XmlDocument();
document.LoadXml(xmlData);

¿hay alguna manera de evitar que el proceso reemplace entidades? Tengo un problema extraño donde tengo un símbolo de TM (almacenado como la entidad # 8482) en el xml que se convierte en el carácter de TM. En lo que a mí respecta, esto no debería ocurrir, ya que el documento XML tiene la codificación ISO-8859-1 (que no tiene el símbolo TM)

Gracias

¿Fue útil?

Solución

Este es un malentendido estándar del conjunto de herramientas XML. Todo el negocio con " & amp; # x " ;, es una característica sintáctica diseñada para hacer frente a las codificaciones de caracteres. Su XmlDocument no es un flujo de caracteres, se ha liberado de problemas de codificación de caracteres, sino que contiene un modelo abstracto de datos de tipo XML. Las palabras para esto incluyen DOM e InfoSet, no estoy seguro exactamente cuál es la correcta.

El " & amp; # x " gubbins no existirá en este modelo porque todo el problema es irrelevante, volverá, si corresponde, cuando transforme el Conjunto de información de nuevo en una secuencia de caracteres en alguna codificación específica.

Este malentendido es lo suficientemente común como para convertirse en literatura académica como parte de una colección de peculiaridades similares. Echa un vistazo a " Xml Fever " en esta ubicación: http://doi.acm.org/10.1145/1364782.1364795

Otros consejos

¿En qué lo estás escribiendo? Un textwriter? una corriente? qué?

Lo siguiente mantiene a la entidad (bueno, la reemplaza con el equivalente hexadecimal), pero si haces lo mismo con un StringWriter, detecta el código Unicode y lo usa en su lugar:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<xml>&#8482;</xml>");
    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriterSettings settings = new  XmlWriterSettings();
        settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
        XmlWriter xw = XmlWriter.Create(ms, settings);
        doc.Save(xw);
        xw.Close();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }

Salidas:

    <?xml version="1.0" encoding="iso-8859-1"?><xml>&#x2122;</xml>

Confieso que las cosas se confunden un poco con los documentos XML y las codificaciones, pero espero que se configure correctamente cuando lo guarde de nuevo, si sigue usando ISO-8859-1, pero si lo guarda con UTF-8, no sería necesario. De alguna manera, lógicamente, el documento realmente contiene el símbolo en lugar de la referencia de la entidad; esta última es solo una cuestión de codificación. (Estoy pensando en voz alta aquí; por favor, no tome esto como información autorizada).

¿Qué estás haciendo con el documento después de cargarlo?

Creo que si encierras el contenido de la entidad en la sección CDATA, debería dejarlo todo solo, por ejemplo,

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>

Las referencias de entidad no son específicas de codificación. Según la Recomendación W3C XML 1.0 :

  

Si la referencia del carácter comienza con   " & amp; # x " ;, los dígitos y las letras hasta   la terminación proporcionar una   representación hexadecimal de la   Punto de código del personaje en ISO / IEC   10646.

El & amp; #xxxx; Las entidades son consideradas como el personaje que representan. Todo el XML se convierte a Unicode en la lectura y cualquiera de estas entidades se elimina en favor del carácter Unicode que representan. Esto incluye cualquier ocurrencia para ellos en una fuente Unicode como la cadena pasada a LoadXML.

Del mismo modo, al escribir, cualquier carácter que no pueda representarse mediante la secuencia a la que se escribe se convierte en un & amp; #xxxx; entidad. No tiene mucho sentido intentar preservarlos.

Un error común es esperar obtener una Cadena de un DOM por algún medio que use una codificación que no sea Unicode. Eso simplemente no sucede a pesar de lo que el     

Gracias por toda la ayuda.

He solucionado mi problema al escribir una función HtmlEncode que reemplaza a todos los caracteres antes de que los escupe a la página web (en lugar de depender de la función HtmlEncode () .NET, que está un tanto rota, que solo parece codificar una pequeña subconjunto de los caracteres necesarios)

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