Articulo de referencia

CDATA

El término CDATA , que significa datos de caracteres , se utiliza con fines distintos, aunque relacionados, en los lenguajes de marcado SGML y XML . El término indica que una pa...

El término CDATA , que significa datos de caracteres , se utiliza con fines distintos, aunque relacionados, en los lenguajes de marcado SGML y XML . El término indica que una parte determinada del documento son datos de caracteres generales , en lugar de datos que no son de caracteres o datos de caracteres con una estructura más específica y limitada.

Secciones CDATA en XML

En un documento XML o entidad externa, una sección CDATA es un fragmento de contenido de elemento que se marca para ser interpretado literalmente, como datos textuales, no como contenido marcado. [ 1 ] Una sección CDATA es simplemente una sintaxis alternativa para expresar datos de caracteres; no hay diferencia semántica entre los datos de caracteres en una sección CDATA y los datos de caracteres en la sintaxis estándar donde, por ejemplo, " <" y " &" se representan por " &lt;" y " &amp;", respectivamente.

Sintaxis e interpretación

Una sección CDATA comienza con la siguiente secuencia:

< ![CDATA[ 

y termina con la siguiente aparición de la secuencia:

]]> 

Todos los caracteres encerrados entre estas dos secuencias se interpretan como caracteres, no como marcado ni como referencias a entidades. Cada carácter se toma literalmente, con la única excepción de la ]]>secuencia de caracteres. En:

<sender> John Smith </sender>

Las etiquetas de inicio y fin "sender" se interpretan como marcado. Sin embargo, el código:

<![CDATA[<sender>John Smith</sender>]]>

es equivalente a:

<sender> John Smith </sender>

Por lo tanto, las "etiquetas" tendrán exactamente el mismo estatus que "John Smith"; serán tratadas como texto.

De forma similar, si la referencia numérica&#240; aparece en el contenido del elemento, se interpretará como el carácter Unicode 00F0 (la letra minúscula eth ). Pero si aparece en una sección CDATA, se analizará como seis caracteres: ampersand, almohadilla, dígito 2, dígito 4, dígito 0 y punto y coma.

Usos de las secciones CDATA

Los autores noveles de documentos XML suelen malinterpretar la función de una sección CDATA, creyendo erróneamente que su propósito es "proteger" los datos para que no se traten como datos de caracteres ordinarios durante el procesamiento. Algunas API para trabajar con documentos XML ofrecen opciones para acceder de forma independiente a las secciones CDATA, pero estas opciones van más allá de los requisitos habituales de los sistemas de procesamiento XML y, aun así, no alteran el significado implícito de los datos. Los datos de caracteres son datos de caracteres, independientemente de si se expresan mediante una sección CDATA o mediante marcado ordinario. Las secciones CDATA son útiles para escribir código XML como datos de texto dentro de un documento XML. Por ejemplo, si se desea maquetar un libro con XSL que explique el uso de una aplicación XML, el marcado XML que aparecerá en el libro se escribirá en el archivo fuente, en una sección CDATA.

Anidación

Una sección CDATA no puede contener la cadena " ]]>" y, por lo tanto, no es posible que una sección CDATA contenga secciones CDATA anidadas. El método preferido para usar secciones CDATA para codificar texto que contiene la tríada " ]]>" es usar varias secciones CDATA dividiendo cada aparición de la tríada justo antes de las " >". Por ejemplo, para codificar " ]]>" se escribiría:

<![CDATA[]]]]><![CDATA[>]]>

Esto significa que para codificar " ]]>" en medio de una sección CDATA, reemplace todas las ocurrencias de " ]]>" con lo siguiente:

]]]]> <![CDATA[>

Esto detiene y reinicia la sección CDATA.

Problemas con la codificación

En los datos de texto, cualquier carácter Unicode que no esté disponible en la codificación declarada en el <?xml ...?>encabezado puede representarse mediante una &#nnn;referencia numérica de caracteres . Sin embargo, el texto dentro de una sección CDATA está estrictamente limitado a los caracteres disponibles en la codificación.

Por este motivo, usar una sección CDATA mediante programación para citar datos que potencialmente podrían contener caracteres ' &' o ' <' puede causar problemas cuando los datos contienen caracteres que no se pueden representar en la codificación. Dependiendo de la implementación del codificador, estos caracteres pueden perderse, convertirse a los caracteres de la &#nnn;referencia de caracteres o provocar un fallo en la codificación. Sin embargo, no se conservarán.

Otro problema es que un documento XML puede transcodificarse de una codificación a otra durante su transmisión. Cuando el documento XML se convierte a un conjunto de caracteres más limitado, como ASCII, los caracteres que ya no se pueden representar se convierten en &#nnn;referencias de caracteres para una conversión sin pérdida de información. Sin embargo, dentro de una sección CDATA, estos caracteres no se pueden representar en absoluto y deben eliminarse o convertirse a algún equivalente, lo que altera el contenido de la sección CDATA.

Uso de CDATA en la salida del programa

Las secciones CDATA en documentos XHTML pueden ser interpretadas de forma diferente por los navegadores web si estos renderizan el documento como HTML, ya que los analizadores HTML no reconocen los marcadores de inicio y fin de CDATA, ni tampoco las referencias a entidades HTML, como las que se encuentran &lt;dentro de las etiquetas. Esto puede causar problemas de renderizado en los navegadores web y generar vulnerabilidades de secuencias de comandos entre sitios (XSS) si se utilizan para mostrar datos de fuentes no confiables, dado que los dos tipos de analizadores no coincidirán en el punto donde termina la sección CDATA.<script>

Dado que resulta útil poder usar signos de menor que ( <) y ampersands ( &) en scripts de páginas web, y en menor medida en estilos, sin tener que recordar escaparlos, es común usar marcadores CDATA alrededor del texto de elementos en línea y en documentos XHTML. Pero para que el documento también pueda ser analizado por analizadores HTML, que no reconocen los marcadores CDATA, estos marcadores generalmente se comentan, como en este ejemplo de JavaScript :<script><style>

< script type = "text/javascript" > //<![CDATA[ document.write ( " < " ); // ]] > </script>

o este ejemplo de CSS :

< style type = "text/css" > /*<![CDATA[*/ body { background-image : url ( "marble.png ? width=300&height=300" ) } /*]]>* / </style>

Esta técnica solo es necesaria cuando se utilizan scripts en línea y hojas de estilo, y es específica del lenguaje. Las hojas de estilo CSS, por ejemplo, solo admiten el segundo estilo de comentarios ( /* … */), pero CSS también tiene menos necesidad de los caracteres <y &que JavaScript y, por lo tanto, menos necesidad de marcadores CDATA explícitos.

CDATA en DTD

Valor de atributo de tipo CDATA

En los archivos de definición de tipo de documento (DTD) para SGML y XML, un valor de atributo puede designarse como de tipo CDATA: datos de caracteres arbitrarios. Dentro de un atributo de tipo CDATA, se permite el marcado de referencias a caracteres y entidades, el cual se procesará al leer el documento.

Por ejemplo, si un DTD XML contiene:

<!ATTLIST foo a CDATA #IMPLIED >

Esto significa que los elementos llamados foo pueden tener opcionalmente un atributo llamado a, que es de tipo CDATA. En un documento XML que sea válido según esta DTD, podría aparecer un elemento como este:

<foo a= "1 & 2 son < 3 " />

y un analizador XML interpretaría el avalor del atributo como los datos del carácter 1 & 2 are < 3.

Entidad de tipo CDATA

Una DTD SGML o XML también puede incluir declaraciones de entidades en las que se utiliza el token CDATA para indicar que la entidad consta de datos de caracteres. Estos datos pueden aparecer dentro de la propia declaración o estar disponibles externamente, referenciados mediante una URI . En ambos casos, se permite el marcado de referencia de caracteres y de referencia de entidades de parámetros en la entidad, y se procesará como tal al leerla.

<DISPLAY_NAME Atributo= "Y" > <![CDATA[PFTEST0__COUNTER_6__:4:199:, PFTEST0__COUNTER_7__:4:199:]]> </DISPLAY_NAME><SVLOBJECT><LONG name= "" val= "" INTEGER name= "" val= "" LONG name= "" val= "" /></SVLOBJECT>

Véase también

Referencias

  1. Secciones CDATA
  • Confusión sobre CDATA en la Wayback Machine (archivado el 29 de noviembre de 2025)
  • Datos y marcado de caracteres (en XML)