kb.erickguedes.com
XML: Estrutura e Processamento

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.