Tipos de datos complejos:
Se utilizará el componente de definición de tipo complejo, esto es <xs:complexType>. Solo se pueden asignar elementos. Un elemento se considera un tipo complejo, si tiene atributos y / o descendientes.
El contenido de elemento es el que está la apertura y cierre de las etiquetas. Un elemento puede contener:
<xs:complexType>
Es un componente de la definición de tipos complejos.
Atributos principales opcionales:
Valores posibles: false, true.
Valores posibles: false, true.
extension, restriction, #all.
Ejemplos:
Caso de elementos complejos
Elementos vacios
<producto pid="1345"/>
Declaración de elemento vacio
Un elemento está vacío (VACÍO, DTD), si no tiene elementos textuales o elementos posteriores (aunque puede tener atributos).
Hay varias maneras de crearlo:
Ejemplo:
HTMLr<br>se declara un tipo complejo de contenido.
<xs:element name="br">
<xs:complexType />
</xs:element>
También hay una declaración alternativa más compleja, pero esto no se recomienda.
<xs:element name="br">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:anyType"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
Declaración de elementos con sub-elemetnos
Que no sean artículos
<trabajador>
<nombre> John </nombre>
<apellido> Smith </apellido>
</trabajador>
Se declarará con un tipo complejo de datos que contiene un elemento y un contenido complejo.
Ejemplo:
HTML <ul> ; Tiene los siguientes elementos (<li>), pero no tiene ningún atributo ni contenido textual. Aquí hay una parte de un documento HTML:
<ul>
<li>Primer elemento</li>
<li>Segundo elemento</li>
</ul>
Esta es la declaración:
<xs:element name="ul">
<xs:complexType>
<xs:sequence>
<xs:element name="li" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
También hay una declaración alternativa más compleja, pero esto no se recomienda.
<xs:element name="ul">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="li" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<trabajador>
<nombre> John </nombre>
<apellido> Smith </apellido>
</ trabajador>
Podemos definir dos formas diferentes:
1. Defina en el elemento "empleado":
<xs:element name="trabajador">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs: element name = "apellido" type = "xs:string"/>
</xs:sequence>
</ xs: complexType>
</ xs: element>
Solo las definiciones lo afectan. ¡Cuidado! El "nombre" y el "apellido" aparecen en el indicador <secuencia>. Esto significa que las etiquetas secundarias deben aparecer en el mismo orden en que fueron declaradas.
2. Un elemento complejo de "empleado", si queremos referirnos más de una vez:
Definimos el tipo = "persona" y usaremos diferentes elementos de definición.
Ejemplo:
Es un tipo complejo de <primerApellido>, <segundoApellido> y <fechaNacimiento> a un elemento <persona> que sigue una serie de tipos esperados.
<xs:element name="persona">
<xs:complexType>
<xs:sequence>
<xs:element name="primerApellido" type="xs:string" />
<xs:element name="segundoApellido" type="xs:string" />
<xs:element name="fechaNacimiento" type="xs:date" />
</xs:sequence>
</xs:complexType>
</xs:element>
Como se mencionó anteriormente, un TipoPersona podría definirse y declararse como un elemento de ese tipo:
<xs:complexType name="TipoPersona">
<xs:sequence>
<xs:element name="primerApellido" type="xs:string" />
<xs:element name="segundoApellido" type="xs:string" />
<xs:element name="fechaNacimiento" type="xs:date" />
</xs:sequence>
</xs:complexType>
<xs:element name="persona" type="TipoPersona">
Modelos de contenido
Cuando se habla de los siguientes elementos, hay otro elemento en el esquema: los compositores o los patrones de contenido.
Los elementos del elemento de un elemento representan su distribución. Constan siempre de un tipo de datos complejo. Hay tres opciones, cada una de las cuales se declara con un componente:
Los elementos aparecen en filas, uno tras otro, en un cierto orden. Se declara con el componente <xs: sequence>. Al igual que con los elementos, la secuencia puede aparecer varias veces. Esta figura es variable y se puede configurar utilizando los atributos minOccurs y maxOccurs (solo son válidos para 1)
Ejemplo:
<mensaje> con los siguientes elementos: <emisor>, <receptor>y <contenido>.
<xs:sequence>
<xs:elementname="emisor" type="xs:string"/>
<xs:element name="receptor" type="xs:string"/>
<xs:element name="contenido" type="xs:string"/>
</xs:sequence>
<xs:element name="emepleado" type="personainfo"/>
<xs:element name="alumno" type="personainfo"/>
<xs:element name="trabajador" type="personainfo"/>
<xs:complexType name="personainfo">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs: element name = "apellido" type = "xs: string" />
</xs:sequence>
</xs:complexType>
Se pueden agregar elementos adicionales a un elemento complejo antes de declararse:
<xs:element name="enpledo" type="fullpersonainfo"/>
<xs:complexType name="personainfo">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name = "apellido" type ="xs: string"/>
</xs: sequence>
</xs: complexType>
<xs:complexType name="fullpersonainfo">
<xs:complexContent>
<xs:base extension = "personinfo">
<xs:sequence>
<xs:element name="Direccion" type="xs:string"/>
<xs:element name="Ciudad" type="xs:string"/>
<xs: element name ="Pais" type = "xs: string" />
</xs: sequence>
</xs: extension>
</ xs: complexContent>
</ xs: complexType>
Los elementos aparecen como alternativas. El único está seleccionado. Se declara con el componente <xs: choice>. La alternativa puede aparecer varias veces. Esta figura es variable y se puede configurar utilizando los atributos minOccurs y maxOccurs (solo son válidos para 1).
Ejemplo:
Al comienzo de una novela, puede tener un elemento <preambulo>, un elemento <introduccion> o elemento <entrada>, solo uno de estos tres, todos los elementos textuales.
<xs:choice>
<xs:elementname="preambula" type="xs:string"/>
<xs:element name="introduccion" type="xs:string"/>
<xs:element name="entrada" type="xs:string"/>
</xs:choice>
Los elementos aparecen en cualquier orden. Se declara con el componente <xs: all>. No se recomienda utilizar esta plantilla de contenido, ya que se pierde el control en cuanto al orden de los elementos. Todos los elementos pueden aparecer 0 o 1 veces. Esta figura se puede configurar con los atributos minOccurs y maxOccurs (ambos son válidos solo para 1).
Ejemplo:
Supongamos que son elementos <alfa> y <omega>, y deben aparecer como el siguiente elemento <griego>, pero el orden es diferente. Sería:
<xs:all>
<xs:element name="alfa" type="xs:string"/>
<xs:element name="omega" type="xs:string"/>
</xs:all>
Considere el esquema "family.xsd". En él, hemos declarado el elemento "person". Por medio de <any> (<lastname>) hemos expandido "person" para agregar nuevos elementos:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Ahora queremos ampliar el elemento "persona" con el elemento "hijos". Podemos hacerlo incluso si el autor de XSD nunca ha declarado elementos "hijos".
Echa un vistazo a este esquema llamado "children.xsd":
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="children">
<xs:complexType>
<xs:sequence>
<xs:element name="childname" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Los documentos XML a continuación ("Myfamily.xml") usarán elementos de uno de dos esquemas diferentes; "family.xsd" y "children.xsd":
<?xml version="1.0" encoding="ISO-8859-1"?>
<persons xmlns="http://www.microsoft.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.microsoft.com family.xsd
http://www.w3schools.com children.xsd">
<person>
<firstname>Hege</firstname>
<lastname>Refsnes</lastname>
<children>
<childname>Cecilie</childname>
</children>
</person>
<person>
<firstname>Stale</firstname>
<lastname>Refsnes</lastname>
</person>
</persons>
Este XML es útil porque "family.xsd" nos permite expandir la "persona" con la adición de nuevos elementos detrás del "apellido".
¡Entonces <any> y <anyAttribute> se usarán para obtener DOCUMENTOS DIGADOS! Con el esquema XML inicial con elementos no reclamados, podemos expandir nuestro documento XML.