Validación de un XML 32
Introducción Se dice que un XML está bien formado cuando esta escrito sintácticamente de forma correcta Como se puede validar sintácticamente un XML? Document Type Definition (DTD) XML Schema Definition (XSD) 33
DTD Como validar un XML si no hay tags predefinidos? DTD <?xml version="1.0"?> <! DOCTYPE nota SYSTEM nota.dtd > <nota> <de>juan</de> <para>pedro</para> <asunto>créditos asignatura XML</asunto> <mensaje>son 4 créditos</mensaje> </nota> Declaración en un archivo externo 34
DTD nota.dtd <!DOCTYPE nota [ <!ELEMENT nota (de,para,asunto,mensaje)> <!ELEMENT de (#PCDATA)> <!ELEMENT para (#PCDATA)> <!ELEMENT asunto (#PCDATA)> <!ELEMENT mensaje (#PCDATA)> ]> PCDATA = Parsed Character Data PCDATA es parseada CDATA = Character Data, no se toma en cuenta para parseo 35
DTD <?xml version="1.0"?> <!DOCTYPE nota [ <!ELEMENT nota (de,para,asunto,mensaje)> <!ELEMENT de (#PCDATA)> <!ELEMENT para (#PCDATA)> <!ELEMENT asunto (#PCDATA)> <!ELEMENT mensaje (#PCDATA)> ]> <nota> <de>juan</de> <para>pedro</para> <asunto>créditos asignatura XML</asunto> <mensaje>son 4 créditos</mensaje> </nota> Declaración en el mismo XML 36
DTD De esta forma un DTD determina la estructura y que tendrá un XML Define los tags validos y como se ramifican Define los atributos validos de cada tag Cuantifica Atributos Elementos 37
Nomenclatura DTD Elementos <!ELEMENT nombredelelemento categoría> ANY Pueden contener cualquier combinación de texto parseable EMPTY Para definir elementos vacíos» <!ELEMENT br EMPTY> <br/> <!ELEMENT nombredelelemento (#PCDATA)> Elementos que tienen texto parseable <!ELEMENT de (#PCDATA)>» <de>juan</de> 38
Nomenclatura DTD Elementos <!ELEMENT nombredelelemento (hijo1,hijo2,...)> Elementos que tienen otros elementos <!ELEMENT nota (de,para,asunto,mensaje)>» <nota> <de>juan</de> <para>pedro</para> <asunto>créditos asignatura XML</asunto> <mensaje>son 4 créditos</mensaje> </nota> Aca los hijos deben aparecer en el mismo orden que aparecen en la secuencia dentro de ( ) 39
Nomenclatura DTD Cuantificaciones en elementos <!ELEMENT nombredelelemento (hijo)> El hijo aparece 1 sola vez dentro del elemento <!ELEMENT prueba (hijodeprueba)>» <prueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> <hijodeprueba> </hijodeprueba> </prueba> 40
Nomenclatura DTD Cuantificaciones en elementos <!ELEMENT nombredelelemento (hijo)+> El hijo aparece al menos 1 vez dentro del elemento <!ELEMENT prueba (hijodeprueba)+>» <prueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> <hijodeprueba> </hijodeprueba> </prueba> 41
Nomenclatura DTD Cuantificaciones en elementos <!ELEMENT nombredelelemento (hijo)*> El hijo pude aparecer 0 o mas veces <!ELEMENT prueba (hijodeprueba)*>» <prueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> <hijodeprueba> </hijodeprueba> </prueba> 42
Nomenclatura DTD Cuantificaciones en elementos <!ELEMENT nombredelelemento (hijo)?> El hijo pude aparecer o no, pero si aparece 1 única vez <!ELEMENT prueba (hijodeprueba)?>» <prueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> </prueba>» <prueba> <hijodeprueba> </hijodeprueba> <hijodeprueba> </hijodeprueba> </prueba> 43
Nomenclatura DTD Cuantificaciones en elementos <!ELEMENT nombredelelemento (hijo1 hijo2)?> El contenido del elemento puede ser tanto hijo1 como hijo2, pero no los 2 a la vez <!ELEMENT prueba (hijodeprueba1,(hijodeprueba2 hijodeprueba3))>» <prueba> </prueba>» <prueba> <hijodeprueba1> </hijodeprueba1> </prueba>» <prueba> <hijodeprueba1> </hijodeprueba1> <hijodeprueba2> </hijodeprueba2> </prueba>» <prueba> <hijodeprueba1> </hijodeprueba1> <hijodeprueba3> </hijodeprueba3> </prueba>» <prueba> <hijodeprueba2> </hijodeprueba2> <hijodeprueba3> </hijodeprueba3> </prueba> 44
Nomenclatura DTD Mezcla de cuantificadores para elementos <!ELEMENT nombredelelemento (hijo1 (hijo2)*)?> El contenido del elemento puede ser solo hijo1, vacío, o muchas veces hijo2 <!ELEMENT nombredelelemento (hijo1 (hijo2)?)* > El contenido del elemento puede ser solo vacío, muchas veces hijo1, muchas veces hijo1, muchas veces hijo2, combinaciones entre hijo1 e hijo2 Es valido? Tiene sentido? 45
Nomenclatura DTD Los atributos son declarados con ATTRLIST <!ATTLIST nombredelelemento nombredelatributo tipodelatributo valordelatributo> <!ATTLIST pago hecho CDATA abonado"> <pago hecho= abonado" /> 46
Nomenclatura DTD Atributos tipodelatributo CDATA El valor es una cadena de caracteres (val1,val2) El valor debe ser uno de la lista de enumerados ID El valor es un ID único IDREF El valor es el ID de otro elemento IDREFS El valor es una lista de otros IDs 47
Nomenclatura DTD Atributos tipodelatributo NMTOKEN El valor debe comenzar con una letra, un dígito, '.', '-', '_', o ': y no contener espacios NMTOKENS El valor es una lista de NMTOKEN separados por espacios ENTITY El valor es una entidad (definida en el DTD) ENTITIES El valor es una lista de ENTITY separada por espacios 48
Nomenclatura DTD Atributos tipodelatributo NOTATION El valor es el nombre de una notación» <!NOTATION vrml PUBLIC "VRML 1.0"> <!ATTLIST code lang NOTATION (vrml) #REQUIRED> <code lang="vrml">some VRML instructions</code> Xml: El valor es un valor XML predefinido» <!ATTLIST description xml:lang NMTOKEN #FIXED "en"> <description xml:lang="en"> 49
Nomenclatura DTD Atributos valordelatributo valor El valor por defecto de un atributo» DTD: <!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0">» XML: <square width="100" /> #REQUIRED Calificador que indica que el atributo es requerido» <!ATTLIST nombredelelemento nombredelatributo tipodelatributo #REQUIRED> DTD: <!ATTLIST person number CDATA #REQUIRED> <person number="5677" /> <person /> 50
Nomenclatura DTD Atributos valordelatributo #IMPLIED Calificador que indica que el atributo no es requerido» <!ATTLIST nombredelelemento nombredelatributo tipodelatributo #IMPLIED>» DTD: <!ATTLIST contact fax CDATA #IMPLIED>» <contact fax="555-667788" />» <contact /> 51
Nomenclatura DTD Atributos valordelatributo #FIXED value Calificador que indica que el valor es fijo» <!ATTLIST nombredelelemento nombredelatributo tipodelatributo #FIXED "value"> DTD: <!ATTLIST sender company CDATA #FIXED "Microsoft"> <sender company="microsoft" /> <sender company= UTU" /> 52
Nomenclatura DTD Atributos Enumerados <!ATTLIST nombredelelemento nombredelatributo (en1 en2..) valorpordefecto> DTD: <!ATTLIST payment type (check cash) "cash"> <payment type="check" /> <payment type="cash" /> 53
Nomenclatura DTD ENTITY Las entidades se utilizan como placeholders <!ENTITY nombredelaentidad valordelaentidad"> DTD: <!ENTITY writer Bugs Bunny "> <!ENTITY copyright "Copyright 2013."> <author>&writer;©right;</author> Eq. <author>bugs Bunny Copyright 2013.</author> 54
Nomenclatura DTD ENTITY Una entidad también se puede definir en otro archivo DTD <!ENTITY nombredelaentidad SYSTEM "URI/URL"> DTD <!ENTITY writer SYSTEM "http://www.utu.edu.uy/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.fing.edu.uy/entities.dtd"> 55
XSD XML Schema Definition Alternativa a DTD <?xml version="1.0"?> <nota xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" xsi:nonamespaceschemalocation="nota.xsd"> <de>juan</de> <para>pedro</para> <asunto>créditos asignatura XML</asunto> <mensaje>son 4 créditos</mensaje> </nota> 56
XSD nota.xsd <xs:element name="nota"> <xs:complextype> <xs:sequence> <xs:element name="e" type="xs:string"/> <xs:element name="para" type="xs:string"/> <xs:element name="asunto" type="xs:string"/> <xs:element name="mensaje" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> 57
XSD Sucesor de DTD Extensible Mayor riqueza expresiva que DTD Soporte a Tipos de datos Namespaces Definidos en un XML No hay que aprender un nuevo lenguaje 58
Nomenclatura XSD El nodo raíz en un XSD es el elemento <schema> con algunos atributos <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema targetnamespace="http://www.utu.edu.uy" xmlns="http://www.utu.edu.uy" elementformdefault="qualified">...... </xs:schema> 59
Nomenclatura XSD xmlns:xs= http://www.w3.org/2001/xmlschema Significa que los elementos y tipos utilizados en este xsd provienen del namespace especificado y que todos estos estarán prefijados con xs: targetnamespace="http://www.utu.edu.uy" Significa que todos los elementos definidos en este xsd provienen del namespace especificado xmlns="http://www.utu.edu.uy" Indica que el namespace por defecto es el especificado elementformdefault="qualified"> Indica que los elementos utilizados en este XSD deben ser calificados con su namespace 60
Nomenclatura XSD Elemento simple Elemento primitivo <xs:element name= nombredelelemento" type= tipodelelemento"/> Tipos mas comunes para poner en tipodelelemento xs:string xs:decimal xs:integer xs:boolean xs:date xs:time Ejemplo <mesa>4 patas</mesa> <xs:element name= mesa type= xs:string /> 61
Nomenclatura XSD Elemento simple Los elementos simples pueden tener un valor por defecto <xs:element name="color" type="xs:string" default= rojo"/> Si no se especifica ningún valor, entonces se asume rojo O un valor fijo <xs:element name="color" type="xs:string" fixed= rojo"/> No se puede especificar otro mas que rojo 62
Nomenclatura XSD Atributos Los atributos son declarados como tipos simples Los elementos simples, no tienen atributos, en caso de que los tengan, pasan a ser elementos complejos <xs:attribute name= nombredelatributo" type= tipodelatributo"/> Tipos mas comunes para poner en tipodelatributo xs:string xs:decimal xs:integer xs:boolean xs:date xs:time 63
Nomenclatura XSD Atributos Ejemplo <apellido lang="en">perez</apellido> <xs:attribute name="lang" type="xs:string"/> Los atributos como los elementos simples, pueden tener un valor por defecto <xs:attribute name="lang" type="xs:string" default="en"/> O un valor fijo <xs:attribute name="lang" type="xs:string" fixed="en"/> 64
Nomenclatura XSD Atributos Los atributos, por defecto, son opcionales Para especificar que un atributo es requerido <xs:attribute name="lang" type="xs:string" use="required"/> 65
Nomenclatura XSD Restricciones Se utilizan para definir valores validos para elementos o atributos Ejemplo valor comprendido: <xs:element name="age"> <xs:simpletype> <xs:restriction base="xs:integer"> <xs:mininclusive value="0" /> <xs:maxinclusive value="120" /> </xs:restriction> </xs:simpletype> </xs:element> Define que la edad debe estar entre 0 y 120 66
Nomenclatura XSD Restricciones Ejemplo valor enumerado: <xs:element name= car"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value= Audi" /> <xs:enumeration value= Ford" /> <xs:enumeration value= Nissan" /> </xs:restriction> </xs:simpletype> </xs:element> Define que los valores posibles para el elemento auto son: Audi, Ford o Nissan 67
Nomenclatura XSD Restricciones Ejemplo patrón: <xs:element name= iniciales"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value= [A-Z] [A-Z] [A-Z]" /> </xs:restriction> </xs:simpletype> </xs:element> Define que las iniciales de una persona deben ser siempre 3 letras en mayusculas, comprendidas entre la A y la Z 68
Nomenclatura XSD Restricciones Ejemplo patrón + exp. regulares: <xs:element name= carta"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value= (a-z)*" /> </xs:restriction> </xs:simpletype> </xs:element> Define que el contenido de una carta son caracteres de la a a la z cuantas veces sean necesarios 69
Nomenclatura XSD Restricciones Ejemplo patrón + exp. regulares: ( )+ male female ( ){8} 70
Nomenclatura XSD Restricciones Caracteres en blanco: Se quieren mantener <xs:element name= direccion"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:whitespace value= preserve" /> </xs:restriction> </xs:simpletype> </xs:element> 71
Nomenclatura XSD Restricciones Caracteres en blanco, CR, LF, TAB: Se quieren remplazar por espacios <xs:element name= direccion"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:whitespace value= replace" /> </xs:restriction> </xs:simpletype> </xs:element> 72
Nomenclatura XSD Restricciones Caracteres en blanco, CR, LF, TAB: Se quieren comprimir <xs:element name= direccion"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:whitespace value= collapse" /> </xs:restriction> </xs:simpletype> </xs:element> LF, CR, TAB son remplazados por espacios Los primeros y últimos espacios (antes y después de la primer y ultima palabra) son eliminados Múltiples espacios contiguos son colapsados a 1 único espacio 73
Nomenclatura XSD Restricciones Largos: Ejemplo <xs:element name= nombre"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:length value= 8" /> </xs:restriction> </xs:simpletype> </xs:element> El nombre de una persona no puede superar los 8 caracteres 74
Nomenclatura XSD Restricciones Largos: Ejemplo <xs:element name= nombre"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:minlength value= 8" /> <xs:maxlength value= 16" /> </xs:restriction> </xs:simpletype> </xs:element> El nombre de una persona no puede ser menor a 8 caracteres ni mayor a 16 75
Nomenclatura XSD Elementos complejos Es un elemento que contiene otros elementos y/o atributos Hay 4 tipos de elementos complejos Elementos vacíos <br/> Elementos que contienen otros elementos <nota><de>juan</de></nota> Elementos que contienen solo texto <de>juan</de> Elementos que contienen texto y otros elementos <valido>esto es un <elemento/> que es valido</valido> 76
Nomenclatura XSD Elementos complejos Como se definen? <xs:element name="empleado"> <xs:complextype> <xs:sequence> <xs:element name="apellido" type="xs:string" /> <xs:element name="nombre" type="xs:string" /> </xs:sequence> </xs:complextype> </xs:element> El elemento <xs:sequence> indica que los elementos apellido y nombre deben aparecer en ese orden 77
Nomenclatura XSD Elementos complejos Se pueden definir así también: <xs:element name="empleado" type="personinfo" /> <xs:complextype name="personinfo"> <xs:sequence> <xs:element name="apellido" type="xs:string" /> <xs:element name="nombre" type="xs:string" /> </xs:sequence> </xs:complextype> Ventajas? 78
Nomenclatura XSD Elementos complejos También se puede tomar como base (extender) otro elemento complejo para agregarle mas elementos <xs:element name="employee" type="fullpersoninfo" /> <xs:complextype name="personinfo"> <xs:sequence> <xs:element name="apellido" type="xs:string" /> <xs:element name="nombre" type="xs:string" /> </xs:sequence> </xs:complextype> <xs:complextype name="fullpersoninfo"> <xs:complexcontent> <xs:extension base="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> 79
Nomenclatura XSD Elementos complejos vacíos Sólo pueden tener atributos <product prodid="1345" /> <xs:element name="producto"> <xs:complextype> <xs:attribute name="prodid" type="xs:positiveinteger"/> </xs:complextype> </xs:element> 80
Nomenclatura XSD Elementos complejos que solo contienen elementos <person> <firstname>john</firstname> <lastname>smith</lastname> </person> <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> </xs:complextype> </xs:element> 81
Nomenclatura XSD Elementos complejos que solo contienen elementos <person> <firstname>john</firstname> <lastname>smith</lastname> </person> xs:sequence indica que los elementos firsname y lastname deben aparecer en ese orden <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> </xs:complextype> </xs:element> 82
Nomenclatura XSD Otra forma de definir lo mismo <xs:element name="person" type="persontype" /> <xs:complextype name="persontype"> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> </xs:complextype> Ventajas/Desventajas? 83
Nomenclatura XSD Ventaja <xs:element name= empleado" type="persontype" /> <xs:element name= gerente" type="persontype" /> <xs:complextype name="persontype"> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> </xs:complextype> 84
Nomenclatura XSD Elementos complejos de contenido simple Solo tienen atributos y texto <xs:element name= algunnombre"> <xs:complextype> <xs:simplecontent> <xs:extension base= tipobase">... </xs:extension> </xs:simplecontent> </xs:complextype> </xs:element> O <xs:element name= algunnombre"> <xs:complextype> <xs:simplecontent> <xs:restriction base=" tipobase ">... </xs:restriction> </xs:simplecontent> </xs:complextype> </xs:element> 85
Nomenclatura XSD Ejemplo de elemento complejo de contenido simple <shoesize country="france">35</shoesize> <xs:element name="shoesize"> <xs:complextype> <xs:simplecontent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simplecontent> </xs:complextype> </xs:element> 86
Nomenclatura XSD Elementos complejos de contenido mixto Pueden contener atributos, texto u otros elementos <letter> Dear Mr. <name>john Smith</name>. Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter> 87
Nomenclatura XSD XSD para el elemento complejo de contenido mixto letter <xs:element name="letter"> <xs:complextype mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string" /> <xs:element name="orderid" type="xs:positiveinteger" /> <xs:element name="shipdate" type="xs:date" /> </xs:sequence> </xs:complextype> </xs:element> 88
Indicadores en XSD Para controlar como se utilizan los elementos en un XML se utilizan 7 tipos de indicadores De orden All Choice Sequence De ocurrencia maxoccurrs minoccurrs De grupo Group name attributegroup name 89
Indicadores de orden Se utilizan para definir el orden de los elementos All Los elementos agrupados bajo este indicador pueden aparecer en cualquier orden, pero deben aparecer como máximo 1 vez <xs:element name="person"> <xs:complextype> <xs:all> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:all> </xs:complextype> </xs:element> 90
Indicadores de orden Choice Especifica que puede ocurrir un elemento u otro <xs:element name="person"> <xs:complextype> <xs:choice> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:choice> </xs:complextype> </xs:element> 91
Indicadores de orden Choice Especifica que puede ocurrir un elemento u otro <xs:element name="person"> <xs:complextype> <xs:choice> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:choice> </xs:complextype> </xs:element> 92
Indicadores de orden Sequence Los elementos deben aparecer en el orden especificado <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> </xs:complextype> </xs:element> 93
Indicadores de orden Sequence Los elementos deben aparecer en el orden especificado <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> </xs:complextype> </xs:element> 94
Indicadores de ocurrencia Definen cuantificaciones sobre las ocurrencias de los elementos Para todos los indicadores de orden y de grupo, el valor por defecto de maxoccurs y minoccurs es 1 maxoccurs Especifica cuantas veces como máximo puede aparecer un elemento minoccurs Especifica cuantas veces como mínimo debe aparecer un elemento 95
Indicadores de ocurrencia Ejemplo <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> <xs:element name="childname" type="xs:string" maxoccurs="10" /> <xs:element name="parentname" type="xs:string" minoccurs="2" maxoccurs="2" /> <xs:element name="age" type="xs:int" minoccurs="0"/> </xs:sequence> </xs:complextype> </xs:element> 96
Indicadores de ocurrencia Como hacer para que un elemento pueda aparecer infinitas veces maxoccurs= unbounded 97
Indicadores de grupo Definen elementos que están relacionados <xs:group name="nombredelgrupo">...</xs:group> Dentro de un grupo se debe definir o un indicador de orden (all, choice, sequence) Ejemplo <xs:group name="persongroup"> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> <xs:element name="birthday" type="xs:date" /> </xs:sequence> </xs:group> 98
Indicadores de grupo Para que sirven los grupos? Una vez definidos, se pueden referenciar <xs:element name="person" type="personinfo" /> <xs:complextype name="personinfo"> <xs:sequence> <xs:group ref="persongroup" /> <xs:element name="country" type="xs:string" /> </xs:sequence> </xs:complextype> 99
Indicadores de grupo Además de los grupos de elementos, existen también los grupos de atributos <xs:attributegroup name="nombredelgrupo">...</xs:attributegroup> Ejemplo <xs:attributegroup name="personattrgroup"> <xs:attribute name="firstname" type="xs:string" /> <xs:attribute name="lastname" type="xs:string" /> <xs:attribute name="birthday" type="xs:date" /> </xs:attributegroup> 100
Indicadores de grupo Para que se usan los grupos de atributos? También para referenciarlos <xs:element name="person"> <xs:complextype> <xs:attributegroup ref="personattrgroup" /> </xs:complextype> </xs:element> 101
Elemento <any> El elmento <any> permite extender un documento XML con elementos que no aparecen en el XSD <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> 102
Elemento <any> <person> <firstname>juan</firstname> <lastname>perez</lastname> <children> <childname>cecilia</childname> </children> </person> <xs:any> definido en <person> 103
Elemento <anyattribute> El elmento <anyattribute> es el analogo al <any> pero aplica a atributos <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> <xs:anyattribute /> </xs:complextype> </xs:element> 104
Elemento <anyattribute> <person gender="male"> <firstname>claudia</firstname> <lastname>suarez</lastname> </person> <xs:anyattribute> definido en <person> 105