Tópicos de Sistemas de Informação A Carlos Oberdan Rolim Ciência da Computação Namespaces Extensibilidade do XML Dados XML são usados para intercâmbio entre organizações XML é extensível XML permite autores de documentos criarem suas próprias tags, definindo a origem dos elementos, atributos e tipos. Em um ambiente distribuído os documentos XML precisam ser gerenciados Problemas da extensibilidade do XML Exemplo: Uma lista dos filmes que estão em cartaz Estendendo um documento existente A lista de filmes pode ser estendida com um novo elemento que corresponde a avaliação da qualidade do filme Estendendo um documento existente Documentos existentes são estendidos para acrescentar novas informações Se a extensão não for gerenciada corretamente podem surgir problemas! Extensões incompátiveis Exemplo: A lista de filmes pode ser estendida com um novo elemento que corresponde a avaliação do filme do ponto de vista da censura Extensões incompátiveis As duas extensões são incompatíveis! Ao combinar as duas avaliações em uma única listagem podem surgir problemas Combinando as duas listas Extensões incompátiveis Qual o problema? Um software para filtrar apenas os filmes inofensivos ficaria perdido Como distinguir os dois tags de avaliação? Qual a solução? Renomear os elementos Renomeando os elementos Renomeando os elementos relativos as avaliações (avaliação de qualidade e avaliação de censura) Solução Não há como impedir que alguém estenda um documento sem que este fique incompatível com outros documentos Qual a solução? Namespaces Não limita a facilidade de extensão da XML, mas permite gerenciá-la. São uma solução para gerenciar a extensibilidade de XML Namespace pode ser definido como um mecanismo para identificar os elementos e atributos de XML Usando namespaces Solução do namespace Dois nomes diferentes são declarados para os elementos avaliação Um prefixo é incluído antes do nome de cada elemento <qua:avaliação> 4 estrelas </qua:avaliação> O prefixo identifica o tipo de avaliação A declaração associa um prefixo a uma URI Declaração de namespaces É feita por meio de atributos utilizando-se o prefixo xmlns seguido pelo prefixo Exemplo: <filmes xmlns:qua = “http://cinemas.com/1.0” xmlns:cen = “http://filme.censura.com/1.0” xmlns = “http://filmes.com/1.0 > Resumindo Os namespaces XML são um mecanismo para identificar de modo não ambíguo quem desenvolveu determinado elemento São importantes em situações onde existem elementos com mesmo nome representando diferentes conceitos Nome do Namespace É o URI e não o prefixo! Dois elementos com prefixos diferentes, mas associados ao mesmo URI são considerados idênticos Declaração de Namespace Associa um sistema de nomeação global (URIs) ao nome dos elementos URIs são usados para garantir a exclusividade dos nomes URIs devem ser criados com base no seu próprio nome e domínio O papel do URI é puramente identificar unicamente os elemento ou atributos Uma URI identifica o proprietário do namespace, por isso não é aconselhável usar o domínio de outras pessoas / organizações Atributos podem ter Namespaces Tanto atributos quanto elementos podem ter namespaces Escopo dos Namespaces O namespace é válido Para o elemento onde está declarado Em todos os elementos dentro de seu conteúdo Default Namespace Se a maior parte dos elementos pertencem ao mesmo namespace, não precisa usar prefixo para cada elemento. Pode-se definir um namespace default que será aplicado para todos os elementos e atributos que não tiverem prefixo. A sintaxe é xmlns=”namespace” Default namespace <employees xmlns="http://www.devxpert.com/schemas/hr/" xmlns:py="http://www.devxpert.com/schemas/payroll/"> <employee> <id>49982</id> <name>Bart Simpson</name> <hireDate>2000-07-04</hireDate> <py:salary>4000765.00</py:salary> <py:taxes>3980765.27</py:taxes> </employee> <employee> <id>12345</id> <name>Hugo Simpson</name> <hireDate>2000-05-29</hireDate> <py:salary>82000.00</py:salary> <py:taxes>16567.87</py:taxes> </employee> </employees> Default namespace Default namespace é aplicado no elemento que é definido e em todos os seus descendentes. Se um desses descendentes usar outro default namespace a sua declaração sobrescreve o anterior tornando-se o default namespace para aquele elemento e todos os seus descendentes. Default namespace <employees xmlns="http://www.devxpert.com/schemas/hr/" xmlns:py="http://www.devxpert.com/schemas/payroll/"> <employee> <id>49982</id> <name>Bart Simpson</name> <hireDate>2000-07-04</hireDate> <salary xmlns="http://www.devxpert.com/schemas/payroll/”> 4000765.00 </salary> <py:taxes>3980765.27</py:taxes> </employee> </employees> Default namespace <mydoc xmlns="uri:my-namespace"> </subnode /> </mydoc> (Default namespace flows into the child - there is no prefix, so it uses the default namespace) <ns0:mydoc xmlns:ns0="uri:my-namespace"> <ns0:subnode /> </ns0:mydoc> (No Default namespace, but ns0 maps to uri:mynamespace) Default namespace <ns0:mydoc xmlns:ns0="uri:my-namespace"> <ns1:subnode xmlns:ns1="uri:my-namespace" /> </ns0:mydoc> (No Default namespace, but ns0 and ns1 both map to uri:my-namespace and hence have identical meaning) <ns0:mydoc xmlns:ns0="uri:my-namespace"> <subnode xmlns="uri:my-namespace" /> </ns0:mydoc> (ns0 is defined on the parent, but we then set a default namespace for this node - and any children, if it had any) XML Schema Validação de documentos XML Recordando: para validar um documento XML Um documento é válido com relação a um dado esquema XML se obdece este esquema Documento XML Parser Esquema XML Documento XML válido Documento XML inválido Linguagens de Esquemas XML DTD – Document Type Definition XML Schema Problemas dos DTDs Sintaxe não XML documento XML usando uma sintaxe e o DTD usando outra sintaxe Não tem tipos de dados, em particular para o conteúdo dos elementos capacidade limitada de tipos de dados DTDs suportam um conjunto muito limitado de tipos de dados. Não podemos dizer “o elemento <salario> deve ser entre 240 e 3000,00” Desejo de se ter um conjunto de tipos de dados compatíveis com aqueles encontrados nos banco de dados Só é marginalmente compatível com namespaces XML Schema Da mesma forma que a DTD Utilizado para descrever a estrutura de um documento XML XML Schemas são mais poderosos que DTDs: Tipos de dados melhor especificado +41 tipos e a capacidade de se criar tipos de dados definidos pelo usuário Escritos em XML (mesma linguagem dos documentos) Podem expressar conjuntos (sets): um elemento filho pode estar em qualquer ordem Podem especificar unicidade (chaves) Uso de técnicas de orientação a objetos Número de elementos (“cardinalidade”) Se um elemento é vazio ou pode incluir texto XML Schema como sucessor da DTD Algumas razões para isso: É extensível Estender/derivar tipos a partir já existentes É mais rico e mais útil do que DTD É escrita em XML Suporta tipos de dados Suporta namespaces Define valores default e fixos para atributos e elementos É uma W3C Recommendation XML Schema Part 0: Primer XML Schema Part 1: Structures XML Schema Part 2: Datatypes Também referida como XSDL: XML Schema Definition Language Tipos Suporte a tipos facilita Descrever o que é ou não permitido no conteúdo de um elemento Validar se um dado está correto Trabalhar com dados vindos de um banco de dados Definir facetas (restrições) aos dados Definir padrões de dados (ou formatos) Converter dados de tipos diferentes Todos os elementos são associados a tipos!! Sintaxe Facilita... Não é necessário aprender outra linguagem Mesmo editor de texto Mesmo parser DOM SAX O esquema pode ser alterado usando XSLT Declaração Ao contrário de DTD Em XMLSchema Todas as declarações (elementos, atributos, etc.) são feitas externamente ao documento XML Não existe declaração interna (ou subconjunto interno) No documento .xsd Declaração DTD XML Schema XML Schema Declaração de chamada Chamada da DTD <?xml version=“1.0”?> <!DOCTYPE artigo SYSTEM “artigo.dtd”> <artigo> <titulo> ... ... </titulo> <autor> <nome> ... ... </nome> </autor> </artigo> Chamada do XML Schema <?xml version="1.0"?> <artigo xmlns="http://www.my.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“c:/artigo.xsd"> <titulo> ... ... </titulo> <autor> <nome> ... ... </nome> </autor> <artigo> Estrutura de um arquivo XML Schema Elemento root: <xs:schema> <!-- declaração de tipos, elementos e atributos -> </xs:schema> Extensao do arquivo: .xsd Alguns atributos de <schema> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema“ targetNamespace="http:// www.domain.com " elementFormDefault="qualified"> <!– definições de elementos e atributos Define o namespace do </xs:schema> XML Schema Alguns atributos de <schema> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema“ targetNamespace="http://www.domain.com" elementFormDefault="qualified"> <!– definições de elementos e atributos Especifica o namespace dos nomes dados aos elementos e atributos do esquema sendo definido </xs:schema> Alguns atributos de <schema> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema“ targetNamespace="http://www.domain.com " elementFormDefault="qualified"> <!– definições de elementos e atributos </xs:schema> Quaisquer elementos usados em instancias XML (docs.xml) devem ser qualificados pelo namespace, ou seja, devem possuir o prefixo do namespace Definição de Elemento Uso da tag <xs:element> Cria um elemento Através do atributo name Associa o elemento a um tipo Através do atributo type <XS:ELEMENT NAME=‘titulo’ TYPE=‘xs:string’/> Definição de Atributo Uso da tag <xs:attribute> Cria um elemento Através do atributo name Associa o elemento a um tipo Através do atributo type <XS:ATTRIBUTE NAME=‘titulo’ TYPE=‘xs:string’/> XML: Exemplo <email data=’01.01.2008’> <de>[email protected]</de> <para>undisclosed-recipients@...</para> <assunto>reuniao</assunto> <corpo fonte=‘Texto plano’> Não esquecam da reuniao de amanha </corpo> </email> XML Schema: Exemplo <xs:element name=‘de’ type=‘xs:string’/> <xs:element name=‘para’ type=‘xs:string’/> <xs:element name=‘assunto’ type=‘xs:string’/> <xs:element name=‘corpo’ type=‘xs:string’/> <xs:attribute name=‘data’ type=‘xs:date’/> <xs:attribute name=‘fonte’ type=‘xs:string’/> Faltou o elemento email!!!! Tipos Complexos Descreve estruturas complexas, com subelementos e atributos <xs:complexType> Definição de Elemento complexo Definição de elemento complexo: Uso de <xs:complexType> Sintaxe 1: <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type=“xs:string“/> <xs:element name=“fone" type="xs:integer"/> <xs:element name=“email" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name=“funcionario” type=“tPessoa”/> <xs:element name=“cliente” type=“tPessoa”/> Definição de Elemento Definição de elemento complexo: Uso de <xs:complexType> Sintaxe 2: <xs:element name=“funcionario”> <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type="xs:string“/> <xs:element name=“fone" type="xs:integer"/> <xs:element name=“email" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> Definição de atributo de um tipo complexo O atributo deve ser colocado DEPOIS do sequence <xs:element name=“funcionario”> <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type="xs:string“/> <xs:element name=“fone" type="xs:integer"/> <xs:element name=“email" type="xs:string"/> </xs:sequence> <xs:attribute name=“cpf" type="xs:string“/> </xs:complexType> </xs:element> Declarações locais vs. globais Pode-se declarar tipos, elementos e atributos globais ou locais Declarações globais: Declarados como filhos do elemento <schema> Declarações podem ser reusadas Declarações locais Não são declarados como filhos de <schema> Exemplo de declaração local <xs:schema> <xs:element name=“funcionario”> <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type=“xs:string“/> <xs:element name=“fone" type=“xs:integer"/> <xs:element name=“email" type=“xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Tipo Tipoepode elementos ser usado podem apenas ser usados para o apenas para elemento o elemento endereço funcionário Exemplo de declaração global <xs:schema> <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type=“xs:string“/> <xs:element name=“fone" type=“xs:integer"/> <xs:element name=“email" type=“xs:string"/> </xs:sequence>Tipo Tipo pode pode ser usado tipoapenas de outros elementos sercomo usado para o como conteúdo de outros elementos </xs:complexType>Elemento pode usado elemento endereço <xs:element name=“funcionario” type=“tPessoa”/> <xs:element name=“cliente” type=“tPessoa”/> </xs:schema> Referência Pode-se referenciar um elemento, ou atributo, que tenha sido declarado anteriormente Elemento, ou atributo, referenciado deve ser global declarado no nível logo abaixo de schema <xs:element name=“nome" type=“xs:string”/> <xs:attribute name=“tipo" type=“xs:string”/> … <xs:complexType name=“tProduto"> <xs:sequence> <xs:element ref=“nome"/> <xs:element name=“modelo” type=“xs:string”/> </xs:sequence> <xs:attribute ref=“tipo“/> </xs:complexType> Referência <xs:element name=“nome" type=“xs:string”/> <xs:element name=“data“> <xs:complexType> <xs:element name=“dia” type=“xs:gDay”/> <xs:element name=“mes” type=“xs:gMonth”/> <xs:element name=“ano” type=“xs:gYear”/> </xs:complexType> </xs:element> … <xs:complexType name=“tPessoa"> <xs:sequence> <xs:element ref=“nome"/> <xs:element ref=“data"/> <xs:element name=“modelo” type=“xs:string”/> </xs:sequence> </xs:complexType> <xs:element name=“Funcionario” type=“tPessoa”/> complexType Define restrições para o modelo de conteúdo de um determinado elemento Especificação de cardinalidade xs:minOccurs xs:maxOccurs Delimitadores de grupos de elementos <xs:sequence> <xs:choice> <xs:all> Cardinalidade xs:minOccurs número mínimo de vezes que um subelemento pode aparecer. Default = 1 xs:maxOccurs número máximo de vezes que um subelemento pode aparecer. Default = 1. Max = unbounded Cardinalidade <xs:complexType name="tProduto"> <xs:sequence> <xs:element name=“nome" type="xs:string"/> <xs:element name=“quantidade" type=“xs:integer“ minOccurs="0“ maxOccurs=“unbounded“/> <xs:element name=“classificacao" type=“tClassific minOccurs="0“ /> </xs:sequence> </xs:complexType> <xs:complexType name="tClassific"> <xs:sequence> <xs:element name=“nome" type="xs:string“/> <xs:element name=“email" type="xs:string“/> </xs:sequence> </xs:complexType> Elementos mistos Uso do atributo mixed <xs:complexType name=“tSecao" mixed="true"> <xs:sequence> <xs:element name=“paragrafo" type="xs:string"/> <xs:element name=“referencia“ type=“xs:integer"/> </xs:sequence> </xs:complexType> <xs:element name=“secao" type=“tSecao"/> No XML: <secao> esta é uma secao com texto e elementos Exercício Construa um XMLSchema, de tal forma que o seguinte documento XML possa ser validado: <notaFiscal> <cliente> <razao_social>JOAQUIM</razao_social> <cgc>00.000.000/0001-00</cgc> <obs>esta observação é sobre <sobre>clientes especiais</sobre> </obs> </cliente> <item> <produto>caneta azul</produto> <quantidade>100</quantidade> <preco_unit>2</preco_unit> </item> </notaFiscal> Valores para elementos <xs:element name=“email" type=“xs:string“ default=“[email protected]"/> Valor por omissão <xs:element name=“supervisor" type=“xs:string“ fixed=“José Carlos Ramalho"/> Valor fixo Delimitadores de grupo <xs:sequence> subelementos devem aparecer na instância XML na mesma ordem em que foram declarados no esquema <xs:choice> somente um dos elementos declarados no grupo pode aparecer na instância <xs:all> os elementos do grupo podem aparecer uma vez JUNTOS ou nenhuma vez e podem aparecer em qualquer ordem Sequence - exemplo No XML Schema: <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type=“xs:string"/> <xs:element name=“fone" type=“xs:integer“/> <xs:element name=“email" type=“xs:string"/> </xs:sequence> </xs:complexType> <xs:element name=“Funcionario” type=“tPessoa”/> Na instancia XML: <Funcionario> <nome>Osvaldo da Silva</nome> <fone>1212121</fone> <email>[email protected]</email> </Funcionario> Sequence – comparando com DTD No XML Schema: <xs:complexType name="tPessoa"> <xs:sequence> <xs:element name=“nome" type=“xs:string"/> <xs:element name=“fone" type=“xs:integer“/> <xs:element name=“email" type=“xs:string"/> </xs:sequence> </xs:complexType> <xs:element name=“Funcionario” type=“tPessoa”/> Na DTD: <!ELEMENT Funcionario (nome, fone, email)> <!ELEMENT nome (#PCDATA)> <!ELEMENT fone (#PCDATA)> <!ELEMENT email (#PCDATA)> Choice - exemplo No XML Schema: <xs:complexType name="tPublic"> <xs:sequence> <xs:element name=“nome” type=“xs:string”/> <xs:choice> <xs:element name=“ISBN" type=“xs:integer"/> <xs:element name=“volume" type=“xs:integer“/> </xs:choice> </xs:sequence> </xs:complexType> <xs:element name=“publicacao” type=“tPublic”/> Na instancia XML: <publicacao> <nome>Projeto de Banco de dados</nome> <ISBN>989898989</ISBN> </publicacao> <publicacao> <nome>SQL Magazine</nome> <volume>9</volume> </publicacao> Choice – comparando com a DTD No XML Schema: <xs:complexType name="tPublic"> <xs:sequence> <xs:element name=“nome” type=“xs:string”/> <xs:choice> <xs:element name=“ISBN" type=“xs:integer"/> <xs:element name=“volume" type=“xs:integer“/> </xs:choice> </xs:sequence> </xs:complexType> <xs:element name=“publicacao” type=“tPublic”/> Na DTD: <!ELEMENT publicacao (nome, (ISBN | volume))> <!ELEMENT nome (#PCDATA)> <!ELEMENT ISBN (#PCDATA)> <!ELEMENT volume (#PCDATA)> All - exemplo No XML Schema: <xs:complexType name=“tAut"> <xs:all> <xs:element name=“nome” type=“xs:string”/> <xs:element name=“email" type=“xs:integer"/> <xs:element name=“instituicao" type=“xs:string“/> </xs:all> </xs:complexType> <xs:element name=“autor” type=“tAut”/> Na instancia XML: <autor> <nome>Ana Clara</nome> • Todos juntos ou nada • Sem restrição de ordem <email>[email protected]</email> <instituicao>Universidade XYZ</instituicao> </autor> All – comparando com a DTD No XML Schema: <xs:complexType name=“tAut"> <xs:all> <xs:element name=“nome” type=“xs:string”/> <xs:element name=“email" type=“xs:integer"/> <xs:element name=“instituicao" type=“xs:string“/> </xs:all> </xs:complexType> <xs:element name=“autor” type=“tAut”/> Na DTD: <!ELEMENT autor (nome | email | instituicao)?> <!ELEMENT nome (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT instituicao (#PCDATA)> Elementos vazios Declarar elemento somente com atributo: <xs:element name=“figura”> <xs:complexType> <xs:attribute name=“nome”> </xs:complexType> <xs:element> Instancia XML: <figura nome=“foto”/> Derivação de Tipos Simples Tipos simples Derivados de tipos simples através de restrição. Processo: Um tipo simples é usado com base sobre ele são aplicadas facetas ou expressões regulares. Restrições ou facetas length: define o comprimento de um tipo de dados minLength: define o comprimento mínimo de um tipo de dados maxLength: define o comprimento máximo de um tipo de dados pattern: define a expressão regular (Regular Expressions) a ser utilizada na validação do tipo enumaration: limita os valores possíveis de um tipo de dados a um conjunto previamente especificado whiteSpace: define como devem ser tratados os espaços em branco. Restrições ou facetas minInclusive: limite mínimo considerando o valor especificado minExclusive: limite mínimo desconsiderando o valor especificado maxInclusive: limite máximo considerando o valor especificado maxExclusive: limite máximo desconsiderando o valor especificado totalDigits: número máximo de dígitos considerando a parte inteira e a parte decimal fractionDigits: número máximo de casas decimais Facetas Faceta “exclusive” Limita um tipo simples a valores mínimo e máximo <xs:simpleType name="tNumero"> <xs:restriction base=“xs:integer"> <xs:minExclusive value="0"/> <xs:maxExclusive value="99999"/> </xs:restriction> </xs:simpleType> Facetas A faceta “enumeration” Limita um tipo simples a um conjunto de valores distintos <xs:simpleType name="TipoFigura"> <xs:restriction base="xs:string"> <xs:enumeration value = "jpeg"/> <xs:enumeration value = "gif"/> <xs:enumeration value = "bmp"/> <xs:enumeration value = "tiff"/> <xs:enumeration value = "wmf"/> </xs:restriction> </xs:simpleType> <xs:attribute name="tipo" type="TipoFigura“/> Facetas Comparando o enumeration no XMLSchema com a DTD: ** XMLSchema <xs:simpleType name="TipoFigura"> <xs:restriction base="xs:string"> <xs:enumeration value = "jpeg"/> <xs:enumeration value = "gif"/> <xs:enumeration value = "bmp"/> <xs:enumeration value = "tiff"/> <xs:enumeration value = "wmf"/> </xs:restriction> </xs:simpleType> <xs:attribute name="tipo" type="TipoFigura“/> ** DTD (só é possível delimitar valores para atributos) <!ELEMENT figura ANY> <!ATTLIST figura tipo NOTATION (jpeg|gif|bmp|tiff|wmf)> Facetas Faceta “pattern” Possibilita a criação de máscaras para os valores <xs:simpleType name="tCep"> <xs:restriction base="xs:string"> <xs:pattern value="\d{5}-\d{3}"/> </xs:restriction> </xs:simpleType> .... <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="male|female"/> </xs:restriction> </xs:simpleType> Facetas Facetas “fractionDigits”, “minInclusive” e “maxInclusive” Possibilita definir como manipular tipos de dados como decimal ou float por exemplo Exemplo: Construção de um tipo “número de filhos” Nesse caso precisamos utilizar como tipo de dados base o tipo decimal, eliminar a quantidade de casas decimais, permitir apenas números positivos (incluindo o zero) e opcionalmente determinar um valor máximo (se seguirmos o Guinness Book esse valor é 900). O fragmento XML abaixo define uma das possibilidades de como esse tipo pode ser criado: <xsd:simpleType name="tNumeroFilhos"> <xsd:restriction base="xsd:decimal"> <xsd:fractionDigits value="0"/> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="900"/> </xsd:restriction> </xsd:simpleType> Facetas Facetas “minLength”, “maxLength” e “whiteSpace” Possibilita definir como manipular tipos de dados como string por exemplo Exemplo: Construção de um tipo de dados Nome Admitindo-se que o tipo de dados “nome” seja um texto com comprimento mínimo de 4 caractéres e máximo de 100 caractéres e que os espaços em branco duplicados devam ser substituídos por um único espaço em branco (“André do Nascimento” por “André do Nascimento”), pode-se construir o tipo de dados nome da seguinte forma: <xsd:simpleType name="tNome"> <xsd:restriction base="xsd:string"> <xsd:minLength value="4"/> <xsd:maxLength value="100"/> <xsd:whiteSpace value="collapse"/> </xsd:restriction> </xsd:simpleType> Construção através de extensão por união Exemplo: Construir tipo por união significa dizer que o tipo construído assumirá todos os valores <xsd:simpleType name="tIdade"> possíveis de seus tipos base. Esse tipo de <xsd:restriction base="xsd:decimal"> construção não é muito comum na construção <xsd:minExclusive value="0"/> de documentos XSD, mas ainda assim <xsd:fractionDigits value="0"/> representa uma possibilidade. <xsd:maxInclusive value="80"/> </xsd:restriction> A construção de tipos através de extensão por união necessita do atributo “union” e do elemento “memberTypes” para representar que o tipo de dados será construído através de extensão por união e quais tipos servirão como tipos base </xsd:simpleType> <xsd:simpleType name="tDataPersonalizada"> <xsd:restriction base="xsd:date"> <xsd:minInclusive value="1950-01-01"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="tIdadeOuData"> <xsd:union memberTypes="tIdade tDataPersonalizada"/> </xsd:simpleType> Os tipos de dados primitivos xs:string xs:boolean xs:decimal xs:float xs:double xs:duration xs:dateTime xs:time xs:date xs:gYearMonth xs:gYear xs:gMonthDay xs:gDay xs:gMonth xs:hexBinary xs:base64Binary xs:anyURI xs:QName xs:NOTATION Exercício Construir o XMLSchema para validar um documento XML com o cadastro de acesso de vários usuários de um site com as seguintes restricoes: O nome de um cliente com tamanho mínimo de 10 caractéres e tamanho máximo de 90 caractéres Um nick name com no mínimo dois caractéres e no máximo 20 caractéres Um e-mail válido Uma senha numérica com no mínimo seis e no máximo oito números O ano de nascimento (superior a 1950 e menor ou igual a 1992) O estado de origem (opcional) Uma opção (sim ou não) para controlar se seus dados (nome, e-mail, ano de nascimento e UF) podem ser visualizados por outros usuários Exercicios XML para ser utilizado no exercicio <usuarios> <usuario> <nome> Carlos Oberdan Rolim </usuario> <nickname>Ober </nickname> <email>[email protected] </email> <senha>minhasenha</senha> <anonascimento>1992</anonascimento> <uf>RS</uf> <visualizadados>S</visualizadados> </usuario> </usuarios>