2010-05-21 14 views
5

Para la interacción con la aplicación de un cliente utilizamos documentos XML. Es decir, enviamos un XML a través de HTTP y recibimos un documento XML de respuesta de la misma manera. El cliente especificó dos esquemas XML que describen el formato de la solicitud y la respuesta. Todo funcionaba bien, hasta que un día el cliente comenzó a usar secciones CDATA en el XML de respuesta. Configuramos nuestro analizador sin tener en cuenta las secciones de CDATA, por lo que no pudimos interpretarlas.¿Está empezando a usar CDATA un cambio de rotura?

Mi pregunta es: ¿Quién ha cometido un error aquí? Traté de encontrar una respuesta en los estándares XML, pero aún no estoy seguro. Creo que no puedo prescribir el uso o no de CDATA en un XSD, ¿verdad? Si es así, ¿no es suficiente acordar un XSD, pero se debe hacer un acuerdo por separado sobre las secciones de CDATA? ¿O uno está obligado a estar preparado para analizar CDATA y el texto normal también?

Me interesan tanto sus opiniones personales como las declaraciones oficiales. ¡Gracias!

Respuesta

6

Muchos analizadores XML separan texto y CDATA, lo cual es desafortunado. El error fue tuyo: no hay diferencia semántica entre los fragmentos de texto regulares y CDATA, por lo que el remitente debe poder elegir libremente según las necesidades del texto en cuestión.

La buena noticia es que debe ser una cuestión simple de adaptar su código.

+0

La desafortunada interfaz del analizador XML lo hace parcialmente culpa de los autores del analizador. – Thilo

+0

Las dos únicas opciones para la falla fueron el emisor y el receptor. El proveedor de analizadores no está permitido. –

+0

ES culpa de OP, pero Thilo hace un buen punto. Si no hay una diferencia semántica entre CDATA y PCDATA, los analizadores no necesitan decirle cuál es un elemento de texto. Pero algunos lo hacen de todos modos. – dan04

6

CDATA es una parte básica de XML. Si no se admite, significa que el analizador está roto (y no es un analizador XML real (que podría manejar elementos que contienen texto, CDATA, entidades, otros elementos, comentarios, etc., etc.)).

Como lo mencioné en un comentario sobre otra respuesta, ahora tengo ganas de repetirlo aquí. No esperar CDATA en XML es como not expecting fish in the sea.

+0

El analizador podría haber manejado el CDATA muy bien, solo proporcionó una forma diferente de obtener contenido regular y contenido CDATA. Solo le pedimos el regular. – kicsit

+3

Al analizar un documento (y generalmente al generar uno) no debería tener que preocuparse por * cómo * se expresa la estructura. Debe ser manejado de forma invisible por el analizador. ¿Los usuarios del analizador escriben cosas como '$ foo = $ bar-> has_cdata? decode_cdata ($ bar-> cdata_content): $ bar-> non_cdata_content; 'es simplemente tonto. También se vuelve inutilizable ya que puede entrar y salir del modo de modo CDATA a voluntad (por lo que parte del contenido del elemento está en un bloque CDATA y parte no). – Quentin

+0

LOL - ¡Punto tomado! :) – kicsit