Problema con XML

Estoy haciendo una actividad con XML, pero me tengo una duda, que es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE universidad[
<!ELEMENT universidad (alumno)*>
<!ELEMENT alumno ((dni|pasaporte,pais_procedencia),nombre,apellidos,fecha_nacimiento,direccion_postal*,telefono*,cuentas_correo*)>
<!ELEMENT dni (#PCDATA)>
<!ELEMENT pasaporte (#PCDATA)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT fecha_nacimiento (#PCDATA)>
<!ELEMENT direccion_postal (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT cuentas_correo (#PCDATA)>
]>

El problema es que en el elemento alumno, tengo que hacer que introduzca el DNI o el pasaporte, y que si introduce este ultimo que ademas ponga tambien el pais de procedencia. He probado de esa manera pero no me funciona, la otra manera que se me ocurre es al pasaporte ponerle un atributo que sea "pais de procedencia".

Alguna idea?
También puedes hacer que pasaporte tenga dos elementos hijos obligatorios, número y país. Aunque no me hagas mucho caso, que esto lo tengo bastante oxidado XD.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE universidad[
<!ELEMENT universidad (alumno)*>
<!ELEMENT alumno ((dni|pasaporte),nombre,apellidos,fecha_nacimiento,direccion_postal*,telefono*,cuentas_correo*)>
<!ELEMENT dni (#PCDATA)>
<!ELEMENT pasaporte (numero,pais)>
<!ELEMENT numero (#PCDATA)>
<!ELEMENT pais (#PCDATA)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT fecha_nacimiento (#PCDATA)>
<!ELEMENT direccion_postal (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT cuentas_correo (#PCDATA)>
]>


Saludos
si, era asi muchas gracias
Utilizar XMLSchema te va a dar más posibilidades que usar DTDs para definir la estructura del XML. Lo mejor que puedes hacer es definir un tipo DNI y otro pasaporte, con sus restricciones, y después en la definición de alumno añadir un elemento documento que sea un CHOICE entre DNI o pasaporte.
He vuelto a tener un problema con otro documento de XML, y ya no se como resolverlo, pongo primero el XML y el XSD y despues comento las pruebas que llevo hechas y el fallo que me da

Aqui el codigo del XML:
<?xml version="1.0" encoding="UTF-8"?>
<supermercado xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:noNamespaceSchemaLocation="siete.xsd">
 
    <articulo id="1">
      <descripcion>Leche desnatada</descripcion>
      <marca>Pascual</marca>
      <medida>1 L</medida>
      <seccion>Leche y batidos</seccion>
    </articulo>
   
    <articulo id="2">
      <descripcion>Leche entera</descripcion>
      <marca>Puleva</marca>
      <medida>1,5 L</medida>
      <seccion>Leche y batidos</seccion>
      <oferta>Lote descuento</oferta>
      <oferta>Dos por uno</oferta>
      <perecedero>
   <fabricacion>Enero 2010</fabricacion>
      </perecedero>
    </articulo>
   
    <articulo id="3">
      <descripcion>Tomate</descripcion>
      <medida>1 Kg </medida>
      <seccion>Frutas y verduras</seccion>
      <perecedero>
   <caducidad>Febrero 2010</caducidad>
      </perecedero>
    </articulo>
   
</supermercado>


Aqui el codigo del XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="0.1" xml:lang="es">
  <xs:element name="supermercado">
    <xs:complexType>
      <xs:sequence>
         <xs:element name="articulo" maxOccurs="unbounded">
   
           <xs:complexType>
            <xs:sequence>
               <xs:element name="descripcion" type="xs:string"/>
               <xs:element name="marca" type="xs:string" minOccurs="0"/>
               <xs:element name="medida" type="xs:string"/>
               <xs:element name="seccion" type="xs:string"/>
               <xs:element name="oferta" type="xs:string" minOccurs="0"/>
         
          <xs:element name="perecedero" minOccurs="0">
            <xs:complexType>
                <xs:sequence>
                  <xs:element name="fabricacion" type="xs:string" minOccurs="0"/>
                  <xs:element name="caducidad" type="xs:string" minOccurs="0" />
                </xs:sequence>
            </xs:complexType>
          </xs:element>
             </xs:sequence>

             <xs:attribute name="id" type="xs:integer"/>
      </xs:complexType>
       </xs:element>
     </xs:sequence>
   </xs:complexType>
</xs:element>
</xs:schema>


Como se puede observar en el documento 2, hay 2 ofertas. El problema esta ahi, si quito una me valida. Es decir con una sola oferta si que me valida, pero tal y como esta ahora no. No comprendo donde puede estar el problema porque se supone que si le añado el minOccurs="0" establece que puede o que no puede aparecer tambien tendria que poner el, maxOccurs?
Si no me equivoco <oferta> está dentro de una secuencia, esto es que los tags en el xml deben ir en orden y no se pueden repetir ...

Si pones el tag oferta en el xsd con maxOccurs='n' si pones el minOccurs ='0' quiere decir que es opcional, pero que solo puede aparecer una vez en el caso de aparecer.
Personalmente no me gusta utilizar secuencias, te limita algo que luego al parsear el XML no es necesario....
xexio escribió:Como se puede observar en el documento 2, hay 2 ofertas. El problema esta ahi, si quito una me valida. Es decir con una sola oferta si que me valida, pero tal y como esta ahora no. No comprendo donde puede estar el problema porque se supone que si le añado el minOccurs="0" establece que puede o que no puede aparecer tambien tendria que poner el, maxOccurs?


Sí, el minOccurs te fija el rango entre 0 y 1, si quieres que pueda haber más de 1 tienes que indicarlo con maxOccurs.
6 respuestas