XML - xml + DTD para formulario

 
Vista:

xml + DTD para formulario

Publicado por ngr (4 intervenciones) el 28/04/2007 18:42:32
Hola a todos. Tengo problemas con hacer un archivo XML + su DTD para almacenar los datos de un formulario HTML.

Poco a poco estoy aprendiendo, con vuestra ayuda, sobre ello (desgraciadamente muy despacio, tengo las fechas de entrega encima y esto es demasiado complejo).

¿Me podríais decir cómo serían los dos ficheros xml y DTD correspondientes?

Todo lo del lado del cliente está resuelto: HTML + JavaScript para validar los datos.

El formulario tiene la estructura que sigue, en HTML. Los campos con (*) son obligatorios. Todos son type="text", menos descripcion="textarea".

Aclaro que, a pesar del aspecto, no es más que un ejercicio académico, no profesional.

Formulario_datos

empresa [IMPLIED]
cargo

nombre.(*) [REQUIRED] etc...
apellidos (*)
dni (*)
letra (*)

direccion (*)
ciudad (*)
codigo (*)
telefono (*)
correo_e

........................................ Se pide también una fecha que JavaScrip se encarga de validar antes del envío (esto ya lo tengo hecho)

dia (*)
mes (*)
ano (*) (Año)

descripcion (TEXTAREA)

........................................... Al final he puesto dos botones
[Borrar] [Enviar]

.................................. Finalmente se me pide también "almacenar" en el xml una posible respuesta desde el servidor.

Gracias

ngr
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:xml + DTD para formulario

Publicado por ngr (4 intervenciones) el 28/04/2007 20:45:58
Hola otra vez.

Vaya lío... No sé si he enviado un comentario o se ha volatilizado, perdón si me repito, pero no lo veo por ningún sitio.

Como intento a lo que pido en el post anterior, adjunto un DTD que adolecerá de un montón de errores, por si alguien se quiere entretener en corregirlo.

--------------- DTD para Formulario_cliente ---------- Intento_01 ---------

<!ELEMENT cliente (empresa, persona, direccion, fecha, descripcion, respuesta)>

<!ELEMENT empresa (nombreEmpresa, cargo)>
<!ELEMENT nombreEmpresa (#PCDATA)>
<!ELEMENT cargo (#PCDATA)>

<!ATTLIST empresa #IMPLIED>

<!ELEMENT persona (nombre, apellidos, dni, letra)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT dni (#PCDATA)>
<!ELEMENT letra (#PCDATA)>

<!ATTLIST persona nombre CDATA #REQUIRED>
<!ATTLIST persona apellidos CDATA #REQUIRED>
<!ATTLIST persona dni CDATA #REQUIRED>
<!ATTLIST persona letra CDATA #REQUIRED>

<!ELEMENT direccion (calle, ciudad, codigo, telefono, correo_e)>
<!ELEMENT calle (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
<!ELEMENT codigo (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT correo_e (#PCDATA)>

<!ATTLIST direccion calle CDATA #REQUIRED>
<!ATTLIST direccion ciudad CDATA #REQUIRED>
<!ATTLIST direccion codigo CDATA #REQUIRED>
<!ATTLIST direccion telefono CDATA #REQUIRED>
<!ATTLIST direccion correo_e CDATA #IMPLIED>

<!ELEMENT fecha (#PCDATA)>
<!ELEMENT dia (#PCDATA)>
<!ELEMENT mes (#PCDATA)>
<!ELEMENT ano (#PCDATA)>

<!ATTLIST fecha dia CDATA #REQUIRED>
<!ATTLIST fecha mes CDATA #REQUIRED>
<!ATTLIST fecha ano CDATA #REQUIRED>

<!ELEMENT descripcion (#PCDATA)>
<!ATTLIST descripcion CDATA #REQUIRED>

<!ELEMENT respuesta (#PCDATA)>
<!ATTLIST respuesta CDATA #REQUIRED>

--------------------------------------------------

Mi primera duda es sobre el empleo de * en el elemento raíz para determinar que puede haber o no haber clientes. Luego sobre poner ? en los elementos de tipo IMPLIED.

Saludos
ngr
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:xml + DTD para formulario

Publicado por Mukuykak (59 intervenciones) el 29/04/2007 04:02:11
Saludos, ngr.

Como un dato principal: en el dtd que pusiste se encuentra el esqueleto de tu archivo xml.
<formulario_cliente>, será la raiz o nodo padre; el primer "hijo" o nodo, será <cliente>; y de <cliente> se ramificará a los subnodos "<empresa>", "<persona>", "<direccion>"...etc, etc.
Bien, ahorrando tiempo, aquí te pongo el xml, pero no dijiste si el dtd lo ibas a incluir en el xml o lo ibas a linkear. Te pongo el xml con el dtd incluído:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE formulario_cliente [<!ELEMENT formulario_cliente (cliente)>

<!ELEMENT cliente (empresa, persona, direccion, fecha, descripcion, respuesta)>

<!ELEMENT empresa (nombreEmpresa, cargo)>
<!ELEMENT nombreEmpresa (#PCDATA)>
<!ELEMENT cargo (#PCDATA)>

<!ATTLIST empresa
nombreEmpresa CDATA #IMPLIED
cargo CDATA #IMPLIED>

<!ELEMENT persona (nombre, apellidos, dni, letra)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT dni (#PCDATA)>
<!ELEMENT letra (#PCDATA)>
<!ATTLIST persona
nombre CDATA #REQUIRED
apellidos CDATA #REQUIRED
dni CDATA #REQUIRED
letra CDATA #REQUIRED>

<!ELEMENT direccion (calle, ciudad, codigo, telefono, correo_e)>
<!ELEMENT calle (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
<!ELEMENT codigo (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT correo_e (#PCDATA)>
<!ATTLIST direccion
calle CDATA #REQUIRED
ciudad CDATA #REQUIRED
codigo CDATA #REQUIRED
telefono CDATA #REQUIRED
correo_e CDATA #IMPLIED>

<!ELEMENT fecha (dia, mes, ano)>
<!ELEMENT dia (#PCDATA)>
<!ELEMENT mes (#PCDATA)>
<!ELEMENT ano (#PCDATA)>
<!ATTLIST fecha
dia CDATA #REQUIRED
mes CDATA #REQUIRED
ano CDATA #REQUIRED>

<!ELEMENT descripcion (#PCDATA)>

<!ELEMENT respuesta (#PCDATA)>]>

<formulario_cliente>
<cliente>
<empresa>
<nombreEmpresa></nombreEmpresa>
<cargo></cargo>
</empresa>

<persona>
<nombre></nombre>
<apellidos></apellidos>
<dni></dni>
<letra></letra>
</persona>

<direccion>
<calle></calle>
<ciudad></ciudad>
<codigo></codigo>
<telefono></telefono>
<correo_e></correo_e>
</direccion>

<fecha>
<dia></dia>
<mes></mes>
<ano></ano>
</fecha>

<descripcion></descripcion>

<respuesta></respuesta>

</cliente>

</formulario_cliente>


En otro post te dejo el xml y el dtd por separado.

Cuando pones el (*), indicas que dicho elemento se presenta ninguna, una o varias veces.
Con el (?), indicas que un elemento se presenta ninguna o una sola vez.
Si usas (+), indicas que un elemento se presenta una o varias veces.
En el dtd que escribes no era necesario poner #REQUIRED, aunque sí #IMPLIED.
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:xml + DTD para formulario

Publicado por ngr (4 intervenciones) el 29/04/2007 16:54:02
Hola, Mukuykak

Qué tío estás hecho... Comparo mi intento de DTD con el tuyo y..., no sólo me resuelves un problema sino que APRENDO, que es lo mejor que me puede pasar. Gracias.

No hace falta que separes DTD y XML, eso creo que soy capaz de hacerlo yo.

Pero voy a hacer algo peor (perdón por el abuso).

Tengo otro DTD para un formulario que me pareció más sencillo que éste y resultó más lioso al contener una información que se recoge mediante el chequeo de una terna de RADIO buttons (el filtro JavaScrip del lado del cliente está resuelto).

El esquema es el siguiente:
Los primeros campos son tipo text, el penúltimo RADIO y el ultimo TEXTAREA
-------------------------------------------------------
formulario_interesado

nombre (*)
apellidos
empresa

direccion (Dirección postal)
telefono
correo_e (Correo electrónico)

( ) carta ( ) telefono (o) correo_e (ModoRespuesta: correo_e, por defecto)

descripcion (*) (TEXTAREA)

----------------------- El DTD que se me ha ocurrido:

<!ELEMENT Formulario_interesado (DatosUsuario, ModoContacto, Descripcion, Respuesta)>
<!ELEMENT DatosUsuario EMPTY>
<!ELEMENT ModoContacto (carta | telefono | correo_e)>
<!ELEMENT carta (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT correo_e (#PCDATA)>
<!ELEMENT Descripcion (#PCDATA)>
<!ELEMENT Respuesta (#PCDATA)>

<!ATTLIST DatosUsuario nombre CDATA #REQUIRED>
<!ATTLIST DatosUsuario apellidos CDATA #IMPLIED>
<!ATTLIST DatosUsuario empresa CDATA #IMPLIED>
<!ATTLIST Formulario_interesado ModoContacto (carta | telefono | correo_e) #REQUIRED>
<!ATTLIST Respuesta CDATA #REQUIRED>

--------------- Un XML posible, suponiendo que se cambie la opción a teléfono:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Formulario_interesado SYSTEM "Formulario_interesado.dtd">

<Formulario_interesado ModoContacto="telefono">

<DatosUsuario nombre="Pepe" apellidos="Díaz Pérez" empresa="Una S.A." />

<MedioContacto>
<telefono>666777888</telefono>
</MedioContacto>

<Descripcion>Dime qué hora es</Descripcion>

<Respuesta>Pues no lo sé</Respuesta>

</Formulario_interesado>

----------------------------------------------------- Funcionaría?

Aviso: YA NO HAY MÁS TRABAJOS PENDIENTES

Esto sería lo último. Salvo investigar para aprender a mi ritmo... Sin urgencias.

Saludos.

ngr

PD. Creo que si yo tuviera que optar me decantaría por trabajar, en el lado del servidor, con PHP y MySQL, me parece todo más sencillo y natural.
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:xml + DTD para formulario

Publicado por Mukuykak (59 intervenciones) el 01/05/2007 09:43:26
Saludos, ngr:

El .XML está perfecto; únicamente en el DTD hubo unos errores. Te pongo el archivo corregido:

----------------------------------------------------------------------------------------------------------------

<!ELEMENT Formulario_interesado (DatosUsuario, MedioContacto, Descripcion, Respuesta)>
<!ELEMENT DatosUsuario>
<!ELEMENT MedioContacto (carta | telefono | correo_e)>
<!ELEMENT carta (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT correo_e (#PCDATA)>
<!ELEMENT Descripcion (#PCDATA)>
<!ELEMENT Respuesta (#PCDATA)>

<!ATTLIST DatosUsuario nombre CDATA #REQUIRED>
<!ATTLIST DatosUsuario apellidos CDATA #IMPLIED>
<!ATTLIST DatosUsuario empresa CDATA #IMPLIED>
<!ATTLIST Formulario_interesado ModoContacto (carta | telefono | correo_e) "telefono">

---------------------------------------------------------------------------------------------------------------
El primer error estaba en el ELEMENT "Formulario_interesado", te faltó poner el nodo "MedioContacto" y en su lugar pusiste el atributo de la raiz, "ModoContacto".

El segundo error estaba en el ELEMENT "DatosUsuarios", no podías poner un valor EMPTY cuando declaras un atributo "nombre" como REQUIRED.

El tercero y último error, fue que atribuíste un atributo al ELEMENT "Respuesta". El <!ATTLIST Respuesta CDATA #REQUIRED>, no era necesario.

Como agregado, en el último atributo agregué un valor por default.
<!ATTLIST Formulario_interesado ModoContacto (carta | telefono | correo_e) "telefono">, esto indica que si no se escoge "carta", "telefono" o "correo_e", el valor de ModoContacto será siempre "telefono". Así, ya no es necesario el uso de #REQUIRED.

Que tengas un excelente 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

DTD más adecuado; chécalo

Publicado por Mukuykak (59 intervenciones) el 30/04/2007 00:57:39
Saludos de nuevo, ngr:

Anoche salí de prisa (una bella chica me esperaba ;-) ) y el dtd que te puse estuvo muy elaborado y, sin embargo, se podía generar de una manera más sencilla y usando los operadores (*, ?, +). Te pongo el dtd.

formulario_cliente.dtd:

<!ELEMENT formulario_cliente (cliente)>

<!ELEMENT cliente (empresa*, persona+, direccion+, fecha+, descripcion+, respuesta+)>

<!ELEMENT empresa (nombreEmpresa?, cargo?)>
<!ELEMENT nombreEmpresa (#PCDATA)>
<!ELEMENT cargo (#PCDATA)>

<!ELEMENT persona (nombre+, apellidos+, dni+, letra+)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT dni (#PCDATA)>
<!ELEMENT letra (#PCDATA)>

<!ELEMENT direccion (calle+, ciudad+, codigo+, telefono+, correo_e*)>
<!ELEMENT calle (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
<!ELEMENT codigo (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT correo_e (#PCDATA)>

<!ELEMENT fecha (dia+, mes+, ano+)>
<!ELEMENT dia (#PCDATA)>
<!ELEMENT mes (#PCDATA)>
<!ELEMENT ano (#PCDATA)>

<!ELEMENT descripcion (#PCDATA)>

<!ELEMENT respuesta (#PCDATA)>

En el primer ELEMENT, indicamos que los atributos que tienen el (*), son opcionales y que pueden aparecer ninguna, una o varias veces.
Los atributos que tienen el (+), son obligatorios: deben aparecer una o más veces.
En el ELEMENT empresa, sus atributos "nombreEmpresa" y "cargo" son opcionales. El signo (?), indica que puede aparecer ninguna o una sola vez.
De preferencia usa mejor este DTD, te validará con mejor eficiencia los xml que quieras validar con él.
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:DTD más adecuado; chécalo

Publicado por ngr (4 intervenciones) el 30/04/2007 16:49:55
Hola, Mukuykak...

Jamás dejes plantada a tu bella chica por una respuesta en el foro, ni ella ni los foreros te lo perdonaríamos nunca... ;-)

Veo la idea que pretendes en este nuevo DTD, pero algo no me cuadra...
A ver si me aclaro:

El <!ELEMENT cliente (empresa*, persona+, direccion+, fecha+, descripcion+, respuesta+)>

Responde a la idea en los elemetnos que le siguen:

<!ELEMENT empresa (nombreEmpresa?, cargo?)>
<!ELEMENT nombreEmpresa (#PCDATA)>
<!ELEMENT cargo (#PCDATA)>

El signo '?' indica que puede haber o no nombreEmpresa y/o cargo... Bien.

Pero, ¿en la primera línea, no estamos dando a entender que un mismo cliente puede tener 0, 1, ó muchas empresas; 1 ó muchas personas, etc.?

En otras palabras, desde mi ignorancia, me cuadra más el primer modelo (sin *, +, ?), dando a entender que cualquier cliente tendrá sólo una 'persona', una 'direccion', etc...

Dejando como atributos #IMPLIED tanto nombreEmpresa como cargo, y #REQUIRED los demás...

En fin, seguiré mirando a ver si lo capto del todo.

Por cierto, ¿te atreves a dar una miradita al DTD que contiene RADIO botones? (Ya dije que es el último)

Siempre que no te llame ninguna lindeza, claro :-)))))

Gracias por tu tiempo. Saludos.
ngr
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