¿Cómo escapar del contenido xml en una cadena sin procesar?

Obtengo una cadena de 'xml' que contiene algún contenido que no tiene escape. Aquí hay un ejemplo trivial:

<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" />

El problema que tengo es cuando intentas convertir lo anterior como una cadena usando XmlDocument.LoadXml(), LoadXml() lanza una excepción debido a la falta de escape en las comillas internas para el contenido del atributo 'texto'. ¿Existe una forma relativamente indolora de escapar del contenido específicamente? ¿O simplemente voy a tener que analizarlo/escaparlo/reconstruirlo yo mismo?

No estoy generando este texto, solo lo obtengo de otro proceso en una cadena como esta:

"<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" />"

preguntado el 27 de julio de 12 a las 21:07

Me ocuparía de obtener lo que sea que genere ese XML para generar obediente XML primero. Esto no es algo con lo que debas tener que lidiar. -

4 Respuestas

Debe usar la codificación de caracteres html donde " is &quot;

Pero dado que su entrada es un texto xml mal formado, debe encontrar una manera de analizar ese texto y reemplazar las comillas con su traducción codificada. Tal vez un poco de análisis de expresiones regulares ...

Considere esto solo como una forma creativa de hacer el trabajo. Sé que está sucio, pero funcionará en la mayoría de los casos:

 private static string XmlEncodeQuotes(string target) {

        string result = string.Empty;
        for (int i = 0; i < target.Length; i++)
        {
            if (target[i] == '"')
            {
                if (target[i - 1] != '=')
                    if (!Regex.IsMatch(target.Substring(i), @"^""\s[a-zA-Z]+="""))
                    {
                        result += "&quot;";
                        continue;
                    }
            }
            result += target[i];
        }
        return result;
    }

Respondido 28 Jul 12, 02:07

sí, espero que haya una manera menos indolora de hacer esto integrada en .NET antes de comenzar a intentar escribir expresiones regulares para limpiarlo ... - mike corcoran

de hecho, creo que es bastante imposible de otra manera porque si comienzas a pensar en la expresión regular, verás que necesitas muchas conjeturas a ciegas: diego de vita

esto es bastante parecido a lo que necesito, solo tuve que hacer un ajuste menor para manejar la expresión regular que coincide con una cita final de un atributo vacío (como: 'id=""'). - mike corcoran

¿Ha intentado envolver la parte del documento xml dentro de una etiqueta CDATA?

Respondido 27 Jul 12, 21:07

No estoy generando el contenido, por lo que no puedo simplemente cambiar el proceso que genera la cadena anterior, si eso es lo que quieres decir. Literalmente obtengo el contenido de arriba en una cadena y eso es todo. - mike corcoran

¿Funcionará System.Security.SecurityElement.Escape() para usted? Si no, también hay un XmlTextWriter.

Respondido 27 Jul 12, 21:07

No estoy votando negativo pero no! ¡no funcionará! simplemente traducirá CUALQUIER carácter "no válido" - diego de vita

De acuerdo, lo volví a leer y pensé que estaba buscando escribir el valor que recibió en un archivo XML diferente, pero si está buscando analizarlo y no es válido, entonces es probable que necesite analizarlo usted mismo o obtener el proveedor del data para enviarle fragmentos XML correctamente escapados, dependiendo de qué tan restringido sea el alcance de los tipos de fragmentos que se le envían (es decir, si siempre son de este estilo de "enlace", entonces el autoanálisis es bastante fácil). - Jared Peless

Si simplemente está preguntando cómo escapar de una cita, eso se hace con

&quot;

No estoy seguro de con qué está lidiando, pero la raíz de su problema es el hecho de que los datos que está recibiendo están mal formados.

  • Opción 1) A menos que limpie los datos, tendrá dificultades para que la mayoría de los analizadores carguen datos XML no válidos. Algunos son más indulgentes que otros. Puede que tengas algo de suerte con el Paquete HTML Agility

  • Opción 2) Use expresiones regulares para arreglar su XML.

  • Opción 3) Si codificar una solución de análisis no es una opción, use XSLT. Simplemente cree una transformación y luego agregue una plantilla para solucionar los problemas.

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.