Estoy trabajando con algún XML que contiene cadenas como:
<node>This is a string</node>
Algunas de las cadenas que estoy pasando a los nodos tendrán personajes como &
, #
, $
, etc .:
<node>This is a string & so is this</node>
Esto no es válido debido a &
.
No puedo envolver estas cadenas en CDATA, ya que deben ser como son. Intenté buscar una lista de caracteres que no se pueden poner en nodos XML sin estar en un CDATA.
¿Alguien puede señalarme en la dirección de uno o proporcionarme una lista de caracteres ilegales?
Respuestas:
Los únicos caracteres ilegales son
&
,<
y>
(así como"
o'
en atributos).Están escapada utilizando entidades XML , en este caso de que desee
&
para&
.Realmente, sin embargo, debe usar una herramienta o biblioteca que escriba XML para usted y resuma este tipo de cosas para que no tenga que preocuparse por eso.
fuente
OK, separemos la pregunta de los personajes que:
La respuesta proporcionada por @dolmen en " Qué son los caracteres no válidos en XML " sigue siendo válida, pero debe actualizarse con la especificación XML 1.1.
1. Caracteres inválidos
Los caracteres descritos aquí son todos los caracteres que pueden insertarse en un documento XML.
1.1. En XML 1.0
La lista global de caracteres permitidos es:
Básicamente, los caracteres de control y los caracteres fuera de los rangos Unicode no están permitidos. Esto significa también que

está prohibido llamar, por ejemplo, a la entidad del personaje .1.2. En XML 1.1
La lista global de caracteres permitidos es:
Esta revisión de la recomendación XML ha extendido los caracteres permitidos para que los caracteres de control estén permitidos y tenga en cuenta una nueva revisión del estándar Unicode, pero estos todavía no están permitidos: NUL (x00) , xFFFE , xFFFF ...
Sin embargo, se desaconseja el uso de caracteres de control y caracteres Unicode indefinidos.
También se puede notar que todos los analizadores no siempre tienen esto en cuenta y los documentos XML con caracteres de control pueden ser rechazados.
2. Caracteres que deben escaparse (para obtener un documento bien formado):
Se
<
debe escapar con una<
entidad, ya que se supone que es el comienzo de una etiqueta.Se
&
debe escapar con una&
entidad, ya que se supone que es el comienzo de una referencia de entidadEl
>
debe escaparse con>
entidad. No es obligatorio, depende del contexto, pero se recomienda encarecidamente escapar de él.Se
'
debe escapar con una'
entidad, obligatoria en los atributos definidos entre comillas simples, pero se recomienda encarecidamente escapar siempre de ella.Se
"
debe escapar con una"
entidad, obligatoria en los atributos definidos entre comillas dobles, pero se recomienda encarecidamente escapar siempre de ella.fuente
La lista de caracteres válidos está en la especificación XML :
fuente
& < > " '
se deben escapar en ciertos contextos.Este es un código C # para eliminar los caracteres inválidos XML de una cadena y devolver una nueva cadena válida.
fuente
\u10000
y\u10FFFF
como caracteres individuales, ya que requieren doschar
instancias utf-16 cada uno, y de acuerdo con los documentos , puede que no haya más de 4 dígitos.[\u10000-\u10FFFF]
es más probable que se analiza como [\u1000
,0-\u10FF
,F
,F
] que es de aspecto extraño pero legal.Los caracteres predeclarados son:
Consulte " ¿Cuáles son los caracteres especiales en XML? " Para obtener más información.
fuente
Además de la respuesta de potame, si desea escapar utilizando un bloque CDATA.
Si coloca su texto en un bloque CDATA, entonces no necesita usar escape . En ese caso, puede usar todos los caracteres en el siguiente rango :
Nota: Además de eso, no puedes usar la
]]>
secuencia de caracteres. Porque coincidiría con el final del bloque CDATA.Si todavía hay caracteres no válidos (por ejemplo, caracteres de control), entonces probablemente sea mejor usar algún tipo de codificación (por ejemplo, base64).
fuente
Otra forma fácil de escapar de caracteres XML / XHTML potencialmente no deseados en C # es:
fuente
Otra forma de eliminar caracteres XML incorrectos en C # es usar
XmlConvert.IsXmlChar
(Disponible desde .NET Framework 4.0)o puede verificar que todos los caracteres sean válidos para XML:
.Net Fiddle
Por ejemplo, el símbolo de tabulación vertical (
\v
) no es válido para XML, es UTF-8 válido, pero no es válido XML 1.0, e incluso muchas bibliotecas (incluido libxml2) lo omiten y generan silenciosamente XML no válido.fuente
En resumen, los caracteres válidos en el texto son:
&
y<
.>
no es válido si sigue]]
.Las secciones 2.2 y 2.4 de la especificación XML proporcionan la respuesta en detalle:
Caracteres
Datos del personaje
fuente
" XmlWriter y caracteres ASCII inferiores " funcionaron para mí
fuente
En C #, use
System.Security.SecurityElement.Escape
oSystem.Net.WebUtility.HtmlEncode
para escapar de estos caracteres ilegales.fuente
Para la gente de Java, Apache tiene una clase de utilidad (
StringEscapeUtils
) que tiene un método auxiliarescapeXml
que se puede usar para escapar caracteres en una cadena usando entidades XML.fuente
En el procesador XML Woodstox, los caracteres no válidos se clasifican por este código:
Fuente de aquí
fuente
Alguien ha intentado esto
System.Security.SecurityElement.Escape(yourstring)
? Esto reemplazará los caracteres XML no válidos en una cadena con su equivalente válido.fuente
Para XSL (en días realmente flojos) uso:
para traducir todos los signos & que no se siguen på amp; a los propios.
Tenemos casos en los que la entrada está en CDATA pero el sistema que usa el XML no lo tiene en cuenta. Es una solución descuidada, cuidado ...
fuente