DTD e XML Schema
Aula 2 de 5
DTD — Document Type Definition
DTD define a estrutura legal de um documento XML usando uma sintaxe própria.
Declaração de Elementos
<!ELEMENT catalogo (produto+)>
<!ELEMENT produto (nome, preco, categoria?, estoque)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT preco (#PCDATA)>
<!ELEMENT categoria (#PCDATA)>
<!ELEMENT estoque (#PCDATA)>
<!ATTLIST produto id CDATA #REQUIRED>
<!ATTLIST preco moeda CDATA #IMPLIED>
Quantificadores e Entidades
<!ELEMENT biblioteca (livro*, revista+, jornal?)>
<!-- *, +, ? significam zero+, um+, zero-ou-um -->
<!ELEMENT endereco (#PCDATA | rua | cidade)*>
<!-- Entidades internas -->
<!ENTITY autor "João Silva">
<!-- Entidades externas -->
<!ENTITY termos SYSTEM "termos.xml">
XSD — XML Schema Definition
XSD usa sintaxe XML e oferece tipagem forte, namespaces e restrições avançadas.
Schema Básico com Tipos Simples
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://exemplo.com/livros"
xmlns="http://exemplo.com/livros"
elementFormDefault="qualified">
<xs:element name="livro">
<xs:complexType>
<xs:sequence>
<xs:element name="titulo" type="xs:string"/>
<xs:element name="autor" type="xs:string"/>
<xs:element name="ano" type="xs:gYear"/>
<xs:element name="preco">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.00"/>
<xs:maxInclusive value="9999.99"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="isbn" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Restrições com Facetas
<xs:simpleType name="codigoProduto">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{4}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="categorias">
<xs:restriction base="xs:string">
<xs:enumeration value="Eletrônicos"/>
<xs:enumeration value="Livros"/>
<xs:enumeration value="Roupas"/>
</xs:restriction>
</xs:simpleType>
Validação na Prática
# Validar XML contra DTD inline
xmllint --valid --noout documento.xml
# Validar XML contra XSD externo
xmllint --schema catalogo.xsd catalogo.xml --noout
# Validar com xmllint e ver erros detalhados
xmllint --schema schema.xsd dados.xml --noout 2>&1
Lab: Criando Schema de Validação
Crie um XSD para um sistema de pedidos e valide documentos.
# 1. Criar schema pedido.xsd
cat << 'EOF' > pedido.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="pedido">
<xs:complexType>
<xs:sequence>
<xs:element name="cliente">
<xs:complexType>
<xs:sequence>
<xs:element name="nome" type="xs:string"/>
<xs:element name="email">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[^@]+@[^@]+\.[a-z]+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="itens">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="produto" type="xs:string" use="required"/>
<xs:attribute name="quantidade">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
EOF
# 2. Validar documento
xmllint --schema pedido.xsd - << 'EOF' 2>&1
<?xml version="1.0"?>
<pedido>
<cliente>
<nome>Maria Santos</nome>
<email>[email protected]</email>
</cliente>
<itens>
<item produto="NOTE-001" quantidade="2"/>
<item produto="MOUSE-003" quantidade="1"/>
</itens>
</pedido>
EOF
# 3. Testar com documento inválido (email errado)
xmllint --schema pedido.xsd - << 'EOF' 2>&1
<?xml version="1.0"?>
<pedido>
<cliente>
<nome>Teste</nome>
<email>invalido</email>
</cliente>
<itens>
<item produto="X" quantidade="0"/>
</itens>
</pedido>
EOF
DTD é legado, XSD é padrão moderno. Prefira XSD para novos projetos.