Esquema XDS para este XML

Tengo que hacer unos ejercicios y todos son iguales, pero me lio la teoría, el ejercicio propuesto no se parece a ningun ejemplo. Los enunciados son construir un .xsd válido para un .xml dado.

.xml dado:

<?xml version="1.0" encoding="UTF-8"?>
<listin xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="listin.xsd" >
  <persona sexo="hombre" id="ricky">
    <nombre>Ricky Martin</nombre>
    <email>ricky@puerto-rico.com</email>
    <relacion amigo-de="leatitia"/>
  </persona>
  <persona sexo="mujer" id="leatitia">
    <nombre>LeatitiaCasta</nombre>
    <email>castal@micasa.com</email>
  </persona>
</listin>


Y para resolverlo tengo:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="listin" type="persona">
    <xs:complexType name="persona">
         <xs:attribute name="sexo" type="xs:string"/>
         <xs:attribute name="id" type="xs:string"/>
      <xs:sequence>
         <xs:element name="nombre" type="xs:string"/>
         <xs:element name="email" type="xs:string"/>
        <xs:element name="relacion" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Seria asi:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="listin" type="persona">
    <xs:complexType name="persona">
         <xs:attribute name="sexo" type="xs:string"/>
         <xs:attribute name="id" type="xs:string"/>
      <xs:sequence>
         <xs:element name="nombre" type="xs:string"/>
         <xs:element name="email" type="xs:string"/>
        <xs:element name="relacion">
          <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="amigo-de" type="xs:string"/>
                </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
         </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>


Los tipos simples no pueden tener atributos asi que relacion se declara de tipo complejo pero indicando que tiene contenido simple.

Un Saludo!
Gracias, voy a ver si con el resuelto ya comprendo la sintaxis y puedo resolver el resto.
chiribe escribió:Tengo que hacer unos ejercicios y todos son iguales, pero me lio la teoría, el ejercicio propuesto no se parece a ningun ejemplo. Los enunciados son construir un .xsd válido para un .xml dado.

.xml dado:

<?xml version="1.0" encoding="UTF-8"?>
<listin xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="listin.xsd" >
  <persona sexo="hombre" id="ricky">
    <nombre>Ricky Martin</nombre>
    <email>ricky@puerto-rico.com</email>
    <relacion amigo-de="leatitia"/>
  </persona>
  <persona sexo="mujer" id="leatitia">
    <nombre>LeatitiaCasta</nombre>
    <email>castal@micasa.com</email>
  </persona>
</listin>


Y para resolverlo tengo:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="listin" type="persona">
    <xs:complexType name="persona">
         <xs:attribute name="sexo" type="xs:string"/>
         <xs:attribute name="id" type="xs:string"/>
      <xs:sequence>
         <xs:element name="nombre" type="xs:string"/>
         <xs:element name="email" type="xs:string"/>
        <xs:element name="relacion" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Comprueba estos puntos:

Para que el elemento persona aparezca más de una vez, hay que poner "maxOccurs="unbounded"

Si vas a declarar el complex type de un elemento y llamarlo desde el elemento con type, debes sacarlo fuera del elemento, como lo pongo abajo.

Por lo demás creo que está bien, el elemento listin es un elemento complejo que tiene atributos e hijos...



<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="listin" type="persona" maxOccurs="unbounded, o el valor que quieras" />
<xs:complexType name="persona">
<xs:attribute name="sexo" type="xs:string"/>
<xs:attribute name="id" type="xs:string"/>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="relacion" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

te pongo un ejemplo mio:

xml:

<?xml version="1.0" encoding="UTF-8"?>

<emails xs:noNamespaceSchemaLocation="email.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<email fecha="2012-01-08">
<remitente id="Daniel"/>
<destinatario recibido="true">Pedro</destinatario>
<CC>Juan, Andrés</CC>
<subject urgente="true"/>
<cuerpo>Este es un mensaje urgente</cuerpo>
</email>
<email fecha="2012-01-08">
<remitente id="Pedro"/>
<destinatario recibido="false">Daniel</destinatario>
<CC>Andres, Antonio</CC>
<subject urgente="true"/>
<cuerpo>Este es un mensaje urgente no recibido</cuerpo>
</email>
<email fecha="2012-01-08">
<remitente id="Juan"/>
<destinatario recibido="true">Antonio</destinatario>
<CC>Daniel, Pedro</CC>
<subject urgente="false"/>
<cuerpo>Este es un mensaje normal recibido</cuerpo>
</email>
</emails>

XSD:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="emails">
<xs:complexType>
<xs:sequence>
<xs:element name="email" type="mail" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="mail">
<xs:sequence>
<xs:element name="remitente">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:ID"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="destinatario">
<xs:complexType>
<xs:simpleContent mixed="true">
<xs:extension base="xs:string">
<xs:attribute name="recibido" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="CC" type="xs:string"/>
<xs:element name="subject">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="urgente" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="cuerpo" type="xs:string"/>
</xs:sequence>
<xs:attribute name="fecha" type="xs:date"/>
</xs:complexType>
</xs:schema>

Puede que tenga algún fallo con el uso del mixed, pero para que te hagas una idea de como se usa el simple content
3 respuestas