visual pagina oficial net from convertir convert cadena c# xml entity

pagina - xml string to object c#



.NET XmlDocument LoadXML y entidades (7)

Al cargar XML en un XmlDocument, es decir,

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

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

Gracias


¿A 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 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())); }

Productos:

<?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 ajuste cuando lo guardes de nuevo, si aún usas ISO-8859-1, pero eso si guardas con UTF- 8, no sería necesario. De alguna manera, lógicamente el documento realmente contiene el símbolo más bien la referencia de la entidad, este último 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 encierra el contenido de la entidad en la sección CDATA debería dejarlo solo, por ejemplo

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


El & # xxxx; se considera que las entidades son el personaje que representan. Todo XML se convierte a Unicode en la lectura y cualquiera de esas entidades se elimina a favor del carácter Unicode que representan. Esto incluye cualquier aparición 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 en la que se escribe, se convierte en un & # xxxx; entidad. No tiene sentido tratar de preservarlos.

Un error común es esperar obtener un String de un DOM de alguna manera que use una codificación distinta a Unicode. Eso simplemente no sucede independientemente de lo que


Este es un malentendido estándar del conjunto de herramientas XML. Todo el asunto con "& # x" es una característica sintáctica diseñada para manejar codificaciones de caracteres. Su XmlDocument no es una secuencia de caracteres, se ha liberado de los 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 exacto.

Los gubbins "& # x" no existirán en este modelo porque todo el problema es irrelevante, volverá, si corresponde, cuando se vuelva a transformar el conjunto de información en una secuencia de caracteres en alguna codificación específica.

Este malentendido es lo suficientemente común como para haberlo incluido en la literatura académica como parte de una colección de caprichos similares. Eche un vistazo a "Fiebre Xml" en esta ubicación: http://doi.acm.org/10.1145/1364782.1364795


Gracias por toda la ayuda.

Resolví mi problema escribiendo una función HtmlEncode que realmente reemplaza todos los caracteres antes de que los escupiera a la página web (en lugar de confiar en la función HtmlEncode () .NET algo quebrada que solo parece codificar un pequeño subconjunto del caracteres necesarios)


Las referencias de entidad no son específicas de codificación. De acuerdo con la Recomendación W3C XML 1.0 :

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