Solución de problemas de formato de documento Hay docenas, si no cientos, de recetas en la lista de mi madre. Si ocurre un error fatal, la depuración será muy difícil: buscará el marcador que falta línea por línea. Si utiliza varios niveles de anidamiento, será difícil encontrar errores.
Pero se puede encontrar buena ayuda. Analizadores: las aplicaciones que analizan código XML e informan errores con formato incorrecto están disponibles gratuitamente en línea. El mejor de ellos es Lark, escrito por Tim Bray, editor técnico y firme defensor de la especificación XML, una de las personas más inteligentes del planeta.
Estoy usando Lark para analizar el código siguiente. Tenga en cuenta que "chispas de chocolate" y su etiqueta de cierre aparecen en la posición incorrecta dentro de la etiqueta </ingredients>:
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >Barras de chispas de chocolate</recipe_name>
<meal>Cena
<course>Postre</course>
</meal>
<ingredientes>
<item>2/3 C de mantequilla</item>
<item>2 C de azúcar moreno</ item>
<item>1 cucharadita de vainilla</item>
<item>1 3/4 taza de harina para todo uso sin tamizar</item>
<item>1 1/2 cucharadita de levadura en polvo</item>
<item>1/2 cucharadita de sal< /item>
<item>3 huevos</item>
<item>1/2 taza de nueces picadas</item>
<item>
</ingredients>2 tazas (paquete de 12 oz) de chips de chocolate semidulce
</item. >
<instrucciones>
Precaliente a 350 grados. Derrita la mantequilla;
combine con el azúcar moreno y la vainillaen
un tazón grande.
Deje enfriar. Combine la harina, el polvo para hornear y la sal.
Agrega
los ingredientes secos reservados, las nueces y las papas fritas.
Distribuye
en
un molde engrasado de 13 por 9 pulgadas. Hornea durante 25 a 30 minutos
hasta
que se enfríe. Corta en cuadritos.
list>
Los siguientes son los resultados devueltos por el analizador:
Informe de error
Línea 17, columna 22: Encontrado </ingredients> esperado </item>
... asumido </item>
Línea 18, columna 36: Encontrado </item> con sin etiqueta de inicio
Con esta información, encontrar el error no será un problema. ¿Qué significa entonces la validez de un archivo XML?
Implementación de la eficacia En última instancia, agregaremos información a un documento XML bien organizado. En realidad, tenemos mucho que hacer -todavía hay crisis al acecho- y aunque el archivo XML está bien organizado,
Pero también se puede perder información crítica. Mire el siguiente ejemplo:
<receta>
<autor>Carol Schmidt</autor>
<recipe_name>Barras de chispas de chocolate</recipe_name>
<comida>Cena <curso>Postre</curso> </comida>
<ingredientes> </ingredientes>
<directions>Derretir la mantequilla; combinar con, etc.... </directions>
</receta>
Esta receta no incluye ingredientes y como está tan bien organizada,
El analizador Lark tampoco encontrará el problema. Cualquiera que haya administrado incluso la más benigna de las bases de datos sabe el error que cometemos los humanos: si tenemos la oportunidad, descartamos información crítica y añadimos tonterías inútiles. Por eso el inventor de XML introdujo DTD:
Definición del tipo de documento. Las DTD proporcionan una manera de garantizar que XML sea más o menos lo que usted desea que sea.
Veamos un DTD utilizado en recetas.
<!DOCTYPE lista [
<!ELEMENT receta (nombre_receta, autor, comida, ingredientes, instrucciones)>
<!Ingredientes DEL ELEMENTO (elemento+)>
<!Comida ELEMENT (#PCDATA, ¿por supuesto?)>
<!ELEMENTO elemento (#PCDATA, sub_elemento*)>
<!ELEMENT nombre_receta (#PCDATA)>
<!Autor del ELEMENTO (#PCDATA)>
<!Curso ELEMENT (#PCDATA)>
<!Elemento ELEMENT (#PCDATA)>
<!Subelemento ELEMENT (#PCDATA)>
<!direcciones ELEMENT (#PCDATA)>
]>
El código puede parecer poco amigable al principio, pero tiene sentido cuando lo desglosas. Expliquemoslo detalladamente:
<!DOCTYPE list [
Esta línea dice que lo que está entre corchetes es un documento con el elemento raíz <list>
DTD. Como mencionamos antes, el elemento raíz contiene todos los demás elementos.
<!ELEMENT receta (nombre_receta, comida, ingredientes, instrucciones)>
Esta línea define la etiqueta <receta>. Los paréntesis significan que las cuatro etiquetas deben aparecer en orden en la etiqueta <recipe>.
<!ELEMENT food (#PCDATA, ¿por supuesto?)>
Esta línea necesita una explicación detallada. He definido la siguiente estructura:
<comida>Aquí el nombre de la comida es obligatorio
<curso>Puede aparecer el nombre de un curso, pero no es así
obligatorio</curso>
</comida>
Hago esto porque, a mi modo de ver, el almuerzo no tiene por qué ser necesariamente un plato específico, pero la cena puede incluir aperitivos, platos principales y postres. Al especificar
#PCDATA: representa datos de caracteres analizados (es decir, datos no binarios) para implementar esta funcionalidad. Aquí, #PCDATA es texto; por ejemplo, "cena".
El signo de interrogación después de "curso" indica que aparecerán 0 o 1 par de etiquetas <curso> en <comida>
dentro del marcador.
Ahora veamos la siguiente línea:
<!ELEMENT ingredientes (item+)>
El signo más aquí indica que al menos un par de etiquetas <item> deben aparecer en <ingredients>
dentro del marcador.
La última línea que nos interesa es:
<!ELEMENT item (#PCDATA, sub_item*)>
Puse sub_item* como medida de seguridad. Además de solicitar el texto de cada elemento, deseo contar la cantidad de contenido de cada elemento. El asterisco indica la cantidad de subelementos que se pueden incluir en la etiqueta <item>. No necesito ningún subelemento para la receta de barras con chispas de chocolate, pero es útil cuando los ingredientes son complejos.
Ahora juntemos esto y veamos qué obtenemos.
Ejemplo completo de DTD A continuación se muestra un ejemplo completo. Agregué otra receta al archivo y agregué
La DTD está anotada. Puedes notar que usé subelementos en la segunda receta.
<?xml versión="1.0"?>
<!--Esto inicia la DTD. Las primeras cuatro líneas dirigen la estructura del documento-->.
<!Lista DOCTYPE ][
<!ELEMENT receta (nombre_receta, autor, comida, ingredientes, instrucciones)>
<!Ingredientes DEL ELEMENTO (elemento+)>
<!Comida ELEMENT (#PCDATA, ¿por supuesto?)>
<!ELEMENTO elemento (#PCDATA, sub_elemento*)>
<!--Estos son los elementos restantes de la etiqueta de receta -->
<!ELEMENT nombre_receta (#PCDATA)>
<!Autor del ELEMENTO (#PCDATA)>
<!direcciones ELEMENT (#PCDATA)>
<!--El elemento restante de la etiqueta de comida -->
<!Curso ELEMENT (#PCDATA)>
<!--El elemento restante de la etiqueta del artículo -->
<!ELEMENT sub_elemento (#PCDATA)>
]>
<?xml versión="1.0"?>
<lista>
<receta>
<autor>Carol Schmidt</autor>
<recipe_name>Barras de chispas de chocolate</recipe_name>
<comida>Cena
<curso>Postre</curso>
</comida>
<ingredientes>
<item>2/3 taza de mantequilla</item>
<item>2 tazas de azúcar moreno</item>
<item>1 cucharadita de vainilla</item>
<item>1 3/4 taza de harina para todo uso sin tamizar</item>
<item>1 1/2 cucharadita de levadura en polvo</item>
<item>1/2 cucharadita de sal</item>
<item>3 huevos</item>
<item>1/2 taza de nueces picadas</item>
<item>2 tazas (paquete de 12 oz) de chips semidulces</item>
</ingredientes>
<direcciones>
Precalienta el horno a 350 grados. Derrita la mantequilla;
combine con el azúcar moreno y la vainilla en un tazón grande.
Deje enfriar. Combine la harina, el polvo para hornear y la sal;
reservar. Agrega los huevos a la mezcla de azúcar enfriada y bate bien;
Agregue los ingredientes secos, las nueces y las papas fritas reservados.
Unte en un molde engrasado de 13 por 9 pulgadas.
Hornee de 25 a 30 minutos hasta que se enfríe.
Cortar en cuadrados.
</direcciones>
</receta>
<receta>
<recipe_name>Pasta con salsa de tomate</recipe_name>
<comida>Cena
<curso>Entrada</curso>
</comida>
<ingredientes>
<item>1 libra de espaguetis</item>
<item>1 lata de 16 oz de tomates cortados en cubitos</item>
<item>4 dientes de ajo</item>
<item>1 cebolla picada</item>
<item>Condimento italiano
<sub_item>orégano</sub_item>
<sub_item>albahaca</sub_item>
<sub_item>pimiento rojo triturado</sub_item>
</elemento>
</ingredientes>
<direcciones>
Hervir la pasta. Saltear el ajo y la cebolla.
Agregue los tomates. Sirva caliente.
</direcciones>
</receta>
</lista>
Ahora que existe una DTD, se verificará el documento para ver si cumple con las restricciones establecidas por la DTD. En otras palabras, queremos garantizar la validez del documento.
Para lograrlo, necesitamos otra herramienta: un analizador de validez. MSXML de Microsoft, un programa basado en Java, es fácil de usar y funciona bien. El documento anterior fue revisado por este programa y no se encontraron errores. Pero si reviso un
Las recetas que no contienen un elemento en la etiqueta de ingrediente devolverán el siguiente mensaje:
los ingredientes no están completos Elementos esperados [elemento].