Professional Documents
Culture Documents
Intro
uma linguagem de anotao, em XML, que possibilita a definio da estrutura e do tipo de dados de outros documentos XML
Substitui as DTDs
Uma definio em XML Shema tambm ela um documento XML com um XSD bem conhecido e definido
Intro
XSDL
XML
uma linguagem de definio de esquemas xml, isto , fornece os mecanismos que permitem definir, elemento, atributos, tipos de elementos, sequencias de elementos, escolhas, quantificadores, etc
XSD
XML
Schema Document
um documento XML, escrito em XSDL, que define a estrutura de um estrutura de um conjunto de documentos XML vlidos
Exemplo 0
ex0.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="Turma" type="xs:string"/> </xs:schema>
A associao entre o XML e o respectivo XSD feita pelo atributo xsi:noNamespaceSchemaLocation no elemento raiz
Elementos Complexos
A declarao de um elemento feita com o elemento XSDL <element> A definio de um tipo complexo iniciada com elemento XSDL <complexType>
Os elementos Turma e Aluno so elementos complexos porque so composto por outros elementos. Neste caso uma sequncia (<sequence>) de elementos
<xs:element name=Aluno"> <xs:complexType> <xs:sequence>
<xs:sequence>
</xs:complexType> </xs:element>
Elementos Complexos
Um elemento que contenha outros elementos, ou atributos, sempre um elemento complexo Um elemento simples s pode conter texto e nunca pode conter elementos Um elemento vazio tambm um elemento complexo. um caso particular
<BR/>
Um elemento complexo pode ser definido de duas formas Definindo, implicitamente, um tipo annimo Usando o atributo type e atribuindo-lhe, como valor, o nome de um tipo definido, explicitamente, no XSD
Definio do tipo turmaTipo Definio de um tipo annimo. Note a ausncia do atributo name
Note-se que o elemento XSDL xs:element tem contedo, o qual necessrio para definir anonimamente o tipo de elemento Aluno
Note-se que o elemento XSDL xs:element vazio. Usa o atributo type para indicar qual o tipo deste elemento Turma
Tipos
O XSDL define 44 tipos internos, todos tipos simples, os quais esto associados ao espao de nomes http://www.w3.org/2001/XMLSchema, atravs do prefixo definido com xmlns
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="nome" type="xs:string"/> </xs:schema>
Adicionalmente podemos definir tipos complexos e tipos simples Os elementos so sempre definidos custa de tipos internos ou de tipos definidos. Os tipos definidos podem ser simples ou complexos A definio dos tipos pode ser implcita (tipos annimos) ou explicita
Tipos internos
Tipo String Boolean decimal float int byte integer long negativeInteger positiveInteger nonPositiveInteger unsignedByte
Tipos internos
Tipo anyURI date time dateTime duration Formato Um endereo absoluto ou relativo yyyy-mm-dd hh:mm:ss-hh:mm yyyy-mm-ddThh:mm:ss-hh:mm PnYnMnDTnHnMnS Exemplo(S) http://www.fe.up.pt/ 2010-05-26 13:20:00-05:00 2010-05-26T13:20:00 P1Y2M3DT5H4M5S, -P120S, P13M
Atributos
Os atributos so declarados apenas para elementos complexos. Dito de outra forma: Um elemento com atributos um elemento complexo A declarao de atributos feita com o elemento XSDL <attribute>
Sendo os atributos parte de um elemento complexo, esta declarao ter de ocorrer, forosamente, dento do elemento XSD <complexType> Esta declarao ocorre sempre aps a definio dos elementos filho, se existirem.
Isto um pouco estranho, visto que nos documentos XML os atributos ocorrem primeiro que os elementos filhos do mesmo elemento, mas ASSIM!!!
Isto faz todo o sentido j que em XML os atributos podem ocorrer em qualquer ordem, ao contrrio dos elementos
Atributos - exemplo
ex3.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType> <xs:sequence> <xs:element name="Aluno> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name=nAlunos" type="xs:positiveInteger"/> <xs:attribute name=Ano" type="xs:positiveInteger"/> <xs:attribute name=disciplina" type="xs:string"/> </xs:complexType> </xs:element> <Turma nAlunos=20 Disciplina=II Ano=2> </xs:schema>
<Aluno>
Um elemento que s contenha atributos um caso particular de um elemento complexo onde no existem filhos elementos nem, filhos texto
Neste caso temos uma sequencia de 0 (zero) elementos seguida da declarao de atributos A declarao <sequence> como vazia pode ser omitida e ficam s as declaraes <attribute>
Um elemento vazio um caso particular de um elemento complexo onde no existem: nem filhos elementos; nem filhos atributo; nem filhos texto
Neste caso temos uma sequencia de 0 (zero) elementos seguida da NO declarao de atributos A declarao <sequence> como vazia pode ser omitida e, como no tem atributos, tambm no h lugar /s declarao/declaraes <attribute> Por isso teremos uma declarao <complexType> vazia
ex5.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType/> </xs:element> <Turma/> </xs:schema>
Sequencias vs Escolhas
Podemos ainda ter escolhas de sequncias, ou sequncias de escolhas Uma sequncia definida recorrendo ao elemento XSDL <sequence> Um escolha definida recorrendo ao elemento XSDL <choice> Um elemento <sequence> pode conter elementos <element>, <sequence> e <choice> Um elemento <choice> pode conter elementos <element>, <sequence> e <choice> O elemento <complexType> pode conter elementos <sequence> , <choice>, <all> ou <group> Os dois ltimos no iro ser aqui abordados mas tem o seguinte propsito
O <group> permite fazer uma referncia a um grupo de elementos definido algures no XSD O elemento <all> , de certa forma, o oposto do <sequence>, isto , os elementos podem ocorrer em qualquer ordem
Escolhas - Exemplo
ex6.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name=turmaTipo" > <xs:sequence> <xs:element name="Aluno> <xs:complexType> <xs:choice> <xs:element name=tel" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:choice> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:element name="Turma type=turmaTipo"/> </xs:schema>
Quantificadores
Os quantificadores permitem especificar os nmeros mnimos e mximos de ocorrncias dos elementos das sequncias e das escolhas O atributo minOccurs define o nmero mnimo de ocorrncias
Quantificadores exemplo 1
ex8.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType> O elemento <xs:sequence> email opcional <xs:element name="Aluno" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="email" type="xs:string minOccurs="0"/> <xs:element name="tel" type="xs:string minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> O elemento tel pode ocorrer um </xs:element> nmero ilimitado de vezes e pode </xs:schema> nem ocorrer
Quantificadores exemplo 2
ex9.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> A sequncia pode <xs:complexType> ocorrer at 20 vezes <xs:sequence maxOccurs=20"> <xs:element name="nome" type="xs:string"/> <xs:element name="email" type="xs:string minOccurs="0"/> <xs:element name="tel" type="xs:string minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <Turma > </xs:complexType> <nome>Ana</nome> </xs:element> 1 sequncia <email>ana@esc.pt</email> </xs:schema> <tel>969000333</tel> <tel>969000334</tel> 2 sequncia <nome>Rita</nome> <nome>Afonso</nome> 3 sequncia <tel>969777334</tel> <nome>Lusa</nome> 4 sequncia <tel>969777885</tel> </Turma>
Tipos simples
O Tipo Interno ou o Tipo Simples so utilizados para definir elementos que s contm texto. No podem conter nem atributos nem outros elementos Um atributo , sempre, de um Tipo Interno ou de um Tipo Simples Um Tipo Simples deriva, por restrio, de um Tipo Interno ou de outro Tipo Simples
A restrio definida com o elemento restriction O atributo base define o tipo de dados que vai ser restringido Dentro do elemento restricion so definidas uma ou vrias restries O tipo de restrio depende do tipo de dados base
Facetas
decimal
integer
Facetas\tipos length minLength maxLength pattern enumeration whiteSpace maxInclusive maxExclusive minExclusive minInclusive totalDigits fractionDigits
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x
anyURI
string
float
time
date
byte
long
int
So elementos com atributos, cujo contedo no integra outros elementos (contedo simples) Um complexType tambm pode ser definido custa de um simpleContent
Os tipos complexos podem ser derivados, por extenso, de tipos complexos A ideia definir tipos bastantes e globais e depois fazer especializaes para cada caso particular A vantagem a melhor manuteno de um XSD e a maior coerncia que se obtm uma aproximao mais orientada a objectos Para se derivar um tipo usa-se o elemento XSDL extension com o atributo base a referenciar um tipo complexo
Exemplo completo
<?xml version="1.0" encoding="UTF-8"?> O tipo pessoa <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> tem contedo <xs:complexType name="pessoa"> simples <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="tel" type="telefone"/> </xs:extension> Os elementos </xs:simpleContent> do tipo pessoa </xs:complexType> tm atributo tel <xs:complexType name="aluno"> <xs:complexContent> <xs:extension base="pessoa"> <xs:attribute name="curso" type="xs:string"/> </xs:extension> <escola> </xs:complexContent> <aluno tel="999333666" curso="LCI">Rita </xs:complexType> </aluno> <xs:simpleType name="telefone"> <aluno tel="999444666" curso="MIEIC">Paulo <xs:restriction base="xs:string"> </aluno> <xs:length value="9"/> <aluno tel="999555666" curso="MIEEC>Rosa </xs:restriction> </aluno> </xs:simpleType> <docente tel="254333666" >Pedro <xs:element name="escola"> </docente> <xs:complexType> <funcionario tel="222333666">Pedro <xs:sequence> </funcionario></escola> <xs:element name="aluno" type="aluno" maxOccurs="unbounded"/> <xs:element name="docente" type="pessoa" maxOccurs="unbounded"/> <xs:element name="funcionario" type="pessoa" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> Os elementos do tipo </xs:element> aluno tm atributo curso </xs:schema>
ex14.xsd
Na declarao dos atributos se nada for referido estes so opcionais O atributo XSDL use pode assumir quer o valor optional quer o valor required explicitando desta forma se o atributo opcional ou obrigatrio
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> O atributo nAlunos opcional por omisso <xs:element name="Turma"> <xs:complexType> <xs:attribute name=nAlunos" type="xs:positiveInteger"/> <xs:attribute name=Ano" type="xs:positiveInteger use=opcional"/> <xs:attribute name=disciplina" type="xs:string use=required"/> </xs:complexType> <Tuma nAlunos=20" Ano="2 disciplina=II"/> </xs:element> </xs:schema> <Tuma disciplina="/>
ex15.xsd
O atributo disciplina tem de estar sempre presente. Se no existirem dados coloca-se o valor nulo, isto , uma string vazia
Elementos/Atributos que sejam repetidos podem ser declarados por referncia a um elemento/atributo definido globalmente no XSD O atributo XSDL ref pode ser usado para fazer referncia a um elemento/atributo global
ex16.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name=Pessoa"> <xs:complexType> <xs:sequence> Definio local do elemento <xs:element name=nome" type="xs:string"/> <xs:element ref="mail" maxOccurs=5"/> Declarao do elemento </xs:sequence> Os quantificadores </xs:element> so definidos na Este elemento diz-se <xs:element name=mail"> declarao e no na <xs:simpleType> global porque est definio global <xs:restriction base=xs:string"> definido no <xs:pattern value=.+@.+\.[a-z]{2,4}/> elemento raiz e no </xs:restriction> dentro de um tipo </xs:simpleType> ou um outro </xs:element> elemento </xs:schema>
Contedos mistos
Um elemento complexo pode conter texto intercalado com elementos, ou vice versa.
Tais elementos so ditos mistos Definem-se na declarao do tipo complexo usando o atributo XSDL mixed com o valor true no elemento XSDL complexType.
ex17.xsd
<?xml version="1.0" encoding="UTF-8"?> Este elemento pode <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> conter outros elementos <xs:element name=Grupo"> intercalados por texto <xs:complexType mixed=true"> <xs:choice maxOccurs =unbounded minOccurs=0"> <xs:element name=aluno" type="xs:string"/> <xs:element name=aluna" type="xs:string"/> </xs:choice> <Grupo>Sem dvida um excelente trabalho, mas nota-se </xs:complexType> a liderana da <aluna>Ana</aluna> e bem secundada </xs:element> pelo <aluno>Pedro</aluno>. O <aluno>Lus</aluno> </xs:schema> raramente participou</Grupo>
Chaves
Na declarao de um elemento pode-se definir as suas chaves com o elemento XSDL key Este elemento composto por dois elementos
Selector que define os conjuntos de elementos Field que define para o conjunto de elemento qual campo (elemento, atributo, texto) que chave.
Os campos chave tem obrigatoriamente de estar presentes e serem nicos dentro do conjunto para o qual foram definidos
Chaves exemplo 1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="aluno"> <xs:sequence> <Escola> <xs:element name="nome" type="xs:string"/> <Alunos> <xs:element name="codigo" type="xs:string"/> <Turma> </xs:sequence> <Aluno> Estes dois elementos </xs:complexType> <nome>Snia</nome> devem ter valores <xs:complexType name="turma"> <codigo>ci007</codigo> distintos entre si <xs:sequence> </Aluno> <xs:element name="Aluno" type="aluno" maxOccurs="20"/> <Aluno> </xs:sequence> <nome>Sofia</nome> </xs:complexType> <codigo>ci008</codigo> <xs:complexType name="alunos"> </Aluno> <xs:sequence> <xs:element name="Turma" type="turma" maxOccurs="10"> </Turma> <Turma> <xs:key name="k1"> No h qualquer problema <Aluno> <xs:selector xpath="Aluno"/> em terem o mesmo valor <nome>Serafim</nome> <xs:field xpath="codigo"/> pois so de elementos <codigo>ci009</codigo> </xs:key> Turma distintos </Aluno> </xs:element> </xs:sequence> <Aluno> Estes dois elementos </xs:complexType> <nome>Sofia</nome> devem ter valores <xs:complexType name="escola"> <codigo>ci008</codigo> distintos entre si <xs:sequence> </Aluno> <xs:element name="Alunos" type="alunos"/> </Turma> </xs:sequence> </Alunos> </xs:complexType> </Escola> <xs:element name="Escola" type="escola"/> </xs:schema>
ex18.xsd
Chaves exemplo 2
ex19.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="inscrio"> <xs:attribute name="disciplina" use="required" type="xs:token"/> <xs:attribute name="aluno" use="required" type="xs:token"/> </xs:complexType> <xs:complexType name="incries"> <xs:sequence> <xs:element name="Inscrio" type="inscrio" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:element name="Inscries" type="incries"> <xs:key name="k"> <xs:selector xpath="Inscrio"/> A chave constituda <xs:field xpath="@disciplina"/> pelo par disciplina/aluno <xs:field xpath="@aluno"/> </xs:key> </xs:element> </xs:schema> <Inscries > <Inscrio disciplina="II" aluno="ci0056"/> <Inscrio disciplina=LTW" aluno="ci0056"/> <Inscrio disciplina=ORI" aluno="ci0057"/> <Inscrio disciplina=LTW" aluno="ci0057"/> </Inscries>
O mesmo aluno mas disciplinas diferentes A mesma disciplina mas alunos diferentes
Unicidade
Por vezes no precisamos de chaves mas apenas de garantir que os campos assumem valores nicos.
Uma chave obriga o campo a existir, a unicidade no. Isto , a chave mais restritiva que a unicidade Na declarao de um elemento pode-se definir as suas unicidades com o elemento XSDL unique Este elemento composto por dois elementos
Selector que define os conjuntos de elementos Field que define para o conjunto de elemento qual campo (elemento, atributo, texto) que nico.
Unicidade - exemplo
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="aluno"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name=email" type="xs:string minOccurs=0"/> </xs:sequence> </xs:complexType> <xs:complexType name="turma"> <xs:sequence> <xs:element name="Aluno" type="aluno" maxOccurs="20"/> </xs:sequence> </xs:complexType> <Escola> A unicidade no <xs:complexType name="alunos"> obriga ocorrncia <Alunos> <xs:sequence> do email <Turma> <xs:element name="Turma" type="turma> <Aluno> <xs:unique name="k1"> <nome>Snia</nome> <xs:selector xpath="Aluno"/> </Aluno> <xs:field xpath=email"/> <Aluno> </xs:key> Estes dois elementos <nome>Sofia</nome> </xs:element> no podem ter o <email>sof@feup.pt</email> </xs:sequence> mesmo contedo </Aluno> </xs:complexType> <Aluno> <xs:complexType name="escola"> <nome>Sofia</nome> <xs:sequence> <email>sofia@feup.pt</email> <xs:element name="Alunos" type="alunos"/> </Aluno> </xs:sequence> </Turma> </xs:complexType> <xs:element name="Escola" type="escola"/> </Escola> </xs:schema>
ex20.xsd
Referncias
Uma referncia restringe o valor do campo lista de todos os valores de uma dada chave
Na declarao de um elemento pode-se definir as suas referncias com o elemento XSDL keyref O atributo XSDL refer identifica a chave referenciada Este elemento composto por dois elementos
Selector que define os conjuntos de elementos Field que define para o conjunto de elemento qual campo (elemento, atributo, texto) que referencia a chave.
Referncias exemplo
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="aluno"> <xs:sequence> A referncia no impede a <xs:element name="nome" type="xs:string"/> repetio de valores. Para <xs:element name="codigo" type="xs:string"/> isso necessrio declarar </xs:sequence> tambm unicidades </xs:complexType> <xs:complexType name="alunoRef"> <xs:attribute type="xs:token" name="cod"/> </xs:complexType> <xs:complexType name="turma"> <xs:sequence> <xs:element name="Aluno" maxOccurs="20" type="alunoRef"/> </xs:sequence> <Escola> </xs:complexType> <Aluno> <xs:complexType name="escola"> <nome>Patrcia</nome> <xs:sequence> <codigo>ei007</codigo> <xs:element name="Aluno" type="aluno" maxOccurs="unbounded"/> <xs:element name="Turma" type="turma" maxOccurs="unbounded"/> </Aluno> </xs:sequence> <Aluno> </xs:complexType> <nome>Pedro</nome> <xs:element name="Escola" type="escola"> <codigo>ei008</codigo> <xs:key name="alunoKey"> </Aluno> <xs:selector xpath="Aluno"/> <Turma> <xs:field xpath="codigo"/> <Aluno cod="ei007"/> </xs:key> <xs:keyref name="turmaRef" refer="alunoKey"> <Aluno cod="ei008"/> <xs:selector xpath="Turma/Aluno"/> <Aluno cod="ei007"/> <xs:field xpath="@cod"/> </Turma> </xs:keyref> </Escola> </xs:element></xs:schema>
ex21.xsd
Espao de Nomes
Embora j tenhamos vindo a trabalhar com espaos de nomes, nomeadamente o espao http://www.w3.org/2001/XMLSchema, onde esto definidos os elemento XSDL, todos os documentos XML definidos at agora tem sido criados no espao de nome annimo
Quando se pretende integrar dados de provenincias diversas a omisso do espao de nomes pode criar conflitos na definio das estruturas dos elementos Definindo os elementos em espaos de nomes nicos evitam-se futuros conflictos
<j:pessoas xmlns:j="http://www.fe.up.pt/~jvv/ex1"> <j:pessoa>Rute</j:pessoa> </j:pessoas> <x:pessoas xmlns:x="http://www.fe.up.pt/~jvv/ex1"> <x:pessoa>Rute</x:pessoa> </x:pessoas> <pessoas xmlns="http://www.fe.up.pt/~jvv/ex1"> <pessoa>Rute</pessoa> </pessoas>
Declarao do espao de nomes por omisso. Neste documento os dois elementos pessoa podem coexistir e, mesmo assim, o documento pode continuar vlido, j que os elementos so de espaos de nomes diferentes, logo no h qualquer conflito
O tipo escola criado no espao de <xs:complexType name="escola"> nomes http://www.fe.up.pt/~jvv/ex1 <xs:sequence> <xs:element name="Aluno" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> Para se enderear </xs:complexType> o tipo escola <xs:element name="Escola" type="ex1:escola"/> preciso tambm </xs:schema> indicar o espao de nomes
O espao de nomes no qual os elementos e os atributos vo ser criados declarado com o atributo XSDL targetNamespace. Quando se usa este atributo todos os tipos, todos os elementos e todos os atributos globais so criados nesse espao de nomes
Associao a um XSD
espao de nomes do elemento raiz
<Aluno>Rafael</Aluno> </ex1:Escola>
Espao de nomes para os elementos do documento Note-se que para um espao de nomes annimo o atributo era xsi:noNamespaceSchemaLocation
Para associar um documento XML a um XML Schema definido para um espao de nomes usa-se o atributo xsi:schemaLocation o qual deve conter, separados por um espao, o respectivo namespace seguido do URL do XSD Se nada for dito no XML Schema s o elemento raiz usa prefixo. Todos os sub- elementos assumem-se desse espao de nomes
ex23.xsd
<ex1:Escola Os subxsi:schemaLocation="http://www.fe.up.pt/~jvv/ex1 ex16.xsd" elementos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" assumem-se xmlns:ex1="http://www.fe.up.pt/~jvv/ex1"> do mesmo URL do XSD
Elementos/Atributos Qualificados
Por omisso os elementos e os atributos de um XSD, com um espao de nomes alvo, so desqualificados, isto , excepo do elemento raiz no devem incluir o prefixo. Assumem-se sempre do espao de nomes do elemento que os contm. Para se qualificar os elementos ou os atributos deve-se usar os atributos XSDL elementFormDefault para os elementos e attributeFormDefault para os atributos
Qualificao - Exemplos
ex24.xsd
<xs:schema targetNamespace="http://www.fe.up.pt/~jvv/ex1" xmlns:ex1="http://www.fe.up.pt/~jvv/ex1" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:complexType name="escola"> <xs:sequence> <xs:element name="Aluno" type="xs:string/> </xs:sequence> <xs:attribute name="nome" type="xs:string"/> </xs:complexType> <xs:element name="Escola" type="ex1:escola"/> </xs:schema>