Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Programação » XML » Um pouco além do XML: Introdução ao XML Schema (XSD) - Parte 4 -->
 
Avaliação: | Publicado em: 27/12/2006
Um pouco além do XML: Introdução ao XML Schema (XSD) - Parte 4


A reutilização de tipos

A declaração de tipos pode ser reaproveitada (seja ele simples ou complexo). Suponha situação hipotética de um arquivo XML para validar uma mensagem de e-mail. Toda mensagem de e-mail possui basicamente um remetente, um destinatário, um assunto e um corpo. Também existem outros elementos (data de envio, protocolo, prioridade, etc), mas para esse exemplo, considere apenas os quatro elementos citados. O esquema abaixo é capaz de representar uma mensagem de e-mail.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!-- Definição do tipo Email para o Remetente -->
<xsd:simpleType name="tEmailRemetente">
 <xsd:restriction base="xsd:string">
  <xsd:pattern value="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/>
 </xsd:restriction>
</xsd:simpleType>

<!-- Definição do tipo Email para o Destinatário -->
<xsd:simpleType name="tEmailDestinatario">
 <xsd:restriction base="xsd:string">
  <xsd:pattern value="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/>
 </xsd:restriction>
</xsd:simpleType>

<!-- Definição do tipo Rementente-->
<xsd:complexType name="tRemetente">
 <xsd:sequence>
  <xsd:element name="Nome" type="xsd:string"/>
  <xsd:element name="Email" type="tEmailRemetente"/>
 </xsd:sequence>
</xsd:complexType>

<!-- Definição do tipo Destinatário-->
<xsd:complexType name="tDestinatario">
 <xsd:sequence>
  <xsd:element name="Nome" type="xsd:string"/>
  <xsd:element name="Email" type="tEmailDestinatario"/>
 </xsd:sequence>
</xsd:complexType>

<!-- Definição do tipo Mensagem -->
<xsd:complexType name="tMensagemEmail">
 <xsd:sequence>
  <xsd:element name="Remetente" type="tRemetente"/>
  <xsd:element name="Destinatario" type="tDestinatario"/>
  <xsd:element name="Assunto" type="xsd:string"/>
  <xsd:element name="Corpo" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>
<xsd:element name="MensagemEmail" type="tMensagemEmail"/>
</xsd:schema>

O documento XML abaixo pode ser validado por esse esquema.

<?xml version="1.0"?>
<MensagemEmail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./Email.xsd">
<Remetente>
 <Nome>Remetente</Nome>
 <Email>rementente@remetente.com.br</Email>
</Remetente>
<Destinatario>
 <Nome>Destinatário</Nome>
 <Email>destinatario@destinatario.com.br</Email>
 </Destinatario>
<Assunto>Mensagem de Teste</Assunto>
<Corpo>Confirme o recebimento</Corpo>
</MensagemEmail>

No exemplo acima, as definições dos tipos tRemetente e tDestinatario são idênticas já que ambas têm de ser e-mails válidos. Inclusive as definições de seus tipos internos (tEmailDestinatario e tEmailDestinatario) também são idênticas. Se essas definições forem alteradas por qualquer razão será necessário redefini-las em dois lugares. É mais sensato criar uma definição em um único local e reaproveitá-la. O mesmo esquema pode ser reescrito da seguinte forma:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!-- Definição do tipo Email -->
<xsd:simpleType name="tEmail">
 <xsd:restriction base="xsd:string">
  <xsd:pattern value="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/>
 </xsd:restriction>
</xsd:simpleType>

<!-- Definição do tipo Envolvido-->
<xsd:complexType name="tEnvolvido--">
 <xsd:sequence>
  <xsd:element name="Nome" type="xsd:string"/>
  <xsd:element name="Email" type="tEmail"/>
 </xsd:sequence>
</xsd:complexType>

<!-- Definição do tipo Mensagem -->
<xsd:complexType name="tMensagemEmail">
 <xsd:sequence>
  <xsd:element name="Remetente" type="tEnvolvido"/>
  <xsd:element name="Destinatario" type="tEnvolvido"/>
  <xsd:element name="Assunto" type="xsd:string"/>
  <xsd:element name="Corpo" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>
<xsd:element name="MensagemEmail" type="tMensagemEmail"/>
</xsd:schema>


Parabens!!!
Parabéns pelo material!!! Muito prático e didático!
Tiru 80% das minhas dúvidas
Ricardo
Muito bom o artigo!!
Muito bom. Aproveito para tirar uma dúvida. Existe alguma ferramenta que faça o mapeamento (um export) de um modelo de dados para XSD? Um abraço