XML - Dudas ind frecuencia y valores pred atributos

 
Vista:

Dudas ind frecuencia y valores pred atributos

Publicado por Alberto (3 intervenciones) el 19/12/2008 01:06:44
Según entiendo los indicadores de frecuencia con esta declaración:

<!ELEMENT etiqueta (nombre, direccion, ciudad+, pais, codPostal, dni)>

Habría de ser obligatorio que en etiqueta hubiera de introducir algo ¿No?

Sin embargo, haciendo esto:

<etiqueta>
<nombre>Carlos Sierra Estibaliz</nombre>
<direccion calle="Pajaritos" numero="2"/>
<direccion calle="Pajaritos2" numero="4" piso="2" planta="2" />
<pais>Espanha</pais>
<codPostal>28082</codPostal>
<dni>12345678-Z</dni>
<vacio/>
<![CDATA[ select * from temas where
numUsuarios!=0]]>
Tres&&&
</etiqueta>

El analizador XML no da ningún problema, pasa algo parecido con el indicador de frecuencia ?, pero en este caso si se asignan elementos más de una vez al mismo elemento. Es como si todos los elementos funcionaran con *.

Mi otra duda se refiere a los valores predeterminados, si los atributos de direccion los tengo definidos así:

<!ATTLIST direccion
calle CDATA #REQUIRED
numero CDATA #REQUIRED
piso CDATA #FIXED "1"
planta CDATA "1">

¿Por qué con el mismo código anterior el analizador xml me muestra que piso ha tomado el valor 2? ¿No debería ser imposible variarlo? ¿Y por qué en el que no he asignado planta se queda en blanco y no toma el valor "1" por defecto?

Gracias por adelantado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dudas ind frecuencia y valores pred atributos

Publicado por Mukuykak (59 intervenciones) el 19/12/2008 05:44:58
Saludos, Alberto.

Cuando en un xml asignas un dtd sin operadores, es obligatorio que aparezca un nodo de cada elemento. El operador ( * ), indica que el nodo que lo tenga puede no aparecer, aparecer una o más veces. El operador ( + ), indica que el nodo que lo tenga debe aparecer una o más veces, pero es obligatorio que aparezca. El operador ( ? ), es una asignación opcional y debe aparecer una o ninguna vez.

Si tú creas un documento xml y no le asignas un dtd, pero está bien formado, el validador no te dará ningún error, e incluso puedes tener repetidos varios nodos; el problema radicará si le asignas un dtd y tu documento no cumple con sus reglas.

Tu ejemplo es una muestra clara de que no estás aplicando el dtd, pues te falta el nodo <ciudad>...</ciudad> y tienes un nodo que no está declarado: "<vacio />". Además, en el ejemplo de dtd que pones estás asignando que el nodo "ciudad" deberá aparecer por lo menos una vez y de manera obligatoria, hasta varias veces, haciendo falta "<ciudad>", como te dije líneas arriba, y en tu código xml repites 2 veces el nodo "<direccion>" sin estar asignado a que se repita. Total, tu xml no pasaría la validación usando tu dtd.

En cuanto a los valores predeterminados en los atributos:
Si tú pones a la disposíción del usuario el poder asignar un valor a un atributo, el valor de este dejará de ser un valor fijo. Simplemente no coloques los atributos dentro de los nodos, así, cuando visualices el xml en un navegador, lo transformes a un archivo de texto, a otro xml o simplemente lo normalices con las herramientas de tu editor de xml (como el XSLTproc), verás que los atributos aparecerán con el valor que tú les asignaste de manera predeterminada.

Te dejo el código xml junto con el dtd incluído, para que lo estudies y compruebes que, al visualizarlo, aparecerán los valores predeterminados en los tributos; sólo quité la etiqueta "<vacio />" y lo que pusiste entre CDATA y asigne al elemento "direccion" para que se repita varias veces.

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE etiqueta [
<!ELEMENT etiqueta (nombre, direccion+, ciudad, pais, codPostal, dni)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT direccion (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
<!ELEMENT pais (#PCDATA)>
<!ELEMENT codPostal (#PCDATA)>
<!ELEMENT dni (#PCDATA)>
<!ATTLIST direccion
calle CDATA #REQUIRED
numero CDATA #REQUIRED
piso CDATA #FIXED "1"
planta CDATA #FIXED "1">]>
<etiqueta>
<nombre>Carlos Sierra Estíbaliz</nombre>
<direccion calle="Pajaritos" numero="2" />
<direccion calle="Pajaritos2" numero="4" />
<ciudad>Alguna</ciudad>
<pais>España</pais>
<codPostal>28082</codPostal>
<dni>12345678-Z</dni>
</etiqueta>

Simplemente ábrelo con tu navegador y verás que si omites los atributos dentro de los nodos, pero si estos aparecen en ATTLIST, automáticamente se agregan al visualizarlos.

Buen día.
=0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas ind frecuencia y valores pred atributos

Publicado por Alberto (3 intervenciones) el 19/12/2008 12:06:40
Muchas gracias por tu ayuda. Ya he comprendido el tema de los valores predeterminados, pero creo que sigo en las mismas con los operadores de frecuencia. En mi ejemplo sí tenía una DTD definida, pero no la he puesto, en todo caso creo que con tu código no se resuelve el problema. Si quito en tu código

<direccion calle="Pajaritos" numero="2" />
<direccion calle="Pajaritos2" numero="4" />

el navegador me ofrece este resultado:

<etiqueta>
<nombre>Carlos Sierra Estíbaliz</nombre>
<ciudad>Alguna</ciudad>
<pais>España</pais>
<codPostal>28082</codPostal>
<dni>12345678-Z</dni>
</etiqueta>

¿No debería de dar algún error al no haber definido ningún nodo direccion?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas ind frecuencia y valores pred atributos

Publicado por Mukuykak (59 intervenciones) el 20/12/2008 05:59:51
Saludos, Alberto.

Claro que debería marcar error, y de hecho yo también veo que los navegadores se saltan ese detalle, sin embargo el código que puse a tu disposición funciona correctamente en el programa editor de xml que uso, y detecta inmediatamente la falta de los nodos "direccion". Al parecer esto es un error de los mismos navegadores, porque si tú parsearas el xml con un programa editor de xml o por medio de algún lenguaje de programación (c++, VB, perl, etc, etc) inmediatamente te marcarían la ausencia de esos nodos.
Te recomiendo usar mejor un programa editor xml-xsl, puesto que estos programas tienen un validador integrado en sus herramientas.

Buen día.
=0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas ind frecuencia y valores pred atributos

Publicado por Alberto (3 intervenciones) el 20/12/2008 11:37:49
Muchas gracias por tu ayuda. El siguiente analizador (http://www.validome.org/xml/validate/) sí que avisa de los problemas que he comentado, por si alguien más tiene problemas con este asunto.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar