Seção 4: Desenvolvedores

Q 4.3: O que são os termos DTDless, válidos e bem formados?

Bem formado significa apenas de síntaxe correta; válido significa que se conforma ao DTD ou Schema.

O XML permite que você use uma Definição de Schema ou Tipo de Documento (DTD) para descrever a marcação (elementos e outras construções) disponíveis em qualquer tipo específico de documento. No entanto, o design e construção de esquemas e DTDs podem ser complexos e não triviais, de modo que XML também permite que você trabalhe sem um. A operação DTDless significa que você pode inventar marcação sem ter que defini-la formalmente, desde que fique preso às regras bem-formadas da sintaxe XML.

Para que isso funcione, um arquivo DTDless é assumido para definir sua própria marcação puramente pela existência e localização de elementos onde você os cria. Quando um aplicativo XML encontra um arquivo DTDless, ele constrói seu modelo interno da estrutura do documento enquanto ele o lê, porque ele não possui Schema ou DTD para dizer o que esperar. Portanto, não há surpresas ou sintaxe ambígua. Para conseguir isso, o documento deve ser "bem formado" (deve seguir as regras).

Para entender por que esse conceito é necessário, veja o HTML padrão como exemplo:

  • O elemento <img> é declarado (nos DTDs [SGML] para HTML) como EMPTY, por isso não possui uma etiqueta final (não existe tal como </img> );

  • Muitos outros elementos HTML (como <para> ) permitem que você omita a etiqueta final por brevidade.

  • Se um processador XML lê um arquivo HTML sem saber isso (porque não está usando um DTD), e ele encontra um <img> ou um <para> (ou qualquer outra tag de início), não teria como saber se esperar ou não uma etiqueta final. Isso torna impossível saber se o resto do arquivo está correto ou não, porque agora não há evidências de se está dentro de um elemento ou se ele foi encerrado.

Os documentos bem formados, portanto, exigem tags iniciais e tags finais em todos os elementos normais, e qualquer elemento EMPTY deve ser feito de forma inequívoca, seja usando tags iniciais e tags finais, ou adicionando uma barra ao nome do início -tag antes do fechamento > como um sinal de que não haverá uma etiqueta final separada.

Todos os documentos XML, tanto DTDless como válidos, devem estar bem formados. Eles devem começar com uma Declaração XML, se necessário (por exemplo, identificando a codificação de caracteres ou usando a Declaração do documento autônomo):


<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> 
<foo> 
  <bar>...<blort/>...</bar> 
</foo> 
    

David Brownell escreve:

O XML que está bem formado não precisa usar uma Declaração de documento autônomo. Tais declarações estão lá para permitir determinadas acelerações ao processar documentos ao ignorar entidades de parâmetros externos - basicamente, você não pode confiar em declarações externas em documentos autônomos. Os tipos que são relevantes são entidades e atributos. Os documentos autônomos não devem exigir qualquer tipo de normalização de valor de atributo ou inadimplentes, caso contrário, eles são inválidos.

Também é possível usar uma declaração de tipo de documento com arquivos DTDless, mesmo que não haja nenhum tipo de documento a qual se referir:

Richard Lander escreve:

Se você precisar de entidades de caractere [além dos cinco incorporados] em um arquivo DTDless, você pode declará-los em um subconjunto interno sem referenciar nada além do tipo de elemento raiz:


<?xml version="1.0" standalone="yes"?> 
<!DOCTYPE example [ 
<!ENTITY mdash "&mdash;"> 
]> 
<example>Hindsight&mdash;a wonderful thing.</example> 

Então… as regras são:

XML Bem formado

  • Todas as tags devem ser equilibradas: isto é, todos os elementos que podem conter dados de caracteres ou sub-elementos devem ter a marca de início e a tag final presente (a omissão não é permitida exceto para os elementos EMPTY, veja abaixo);

  • Todos os valores dos atributos devem estar entre aspas. O caractere de citação única (o apóstrofo) pode ser usado se o valor contiver um caractere de cotação dupla e vice-versa. Se você precisa de cotações isoladas como dados também, você pode usar &apos; ou &quot; . Em nenhuma circunstância, use vírgulas invertidas tipográficas ('curly') automatizadas substituídas por alguns processadores de texto para cotação de valores de atributos.

  • Quaisquer elementos EMPTY (por exemplo, aqueles sem tag final como HTML <img> , <hr> , e <br> e outros) devem terminar com />   ou ou devem se parecer com elementos não-EMPTY, tendo uma tag final real (Mas sem conteúdo). Exemplo: <br> seria <br/> ou <br> </br> (com nada no meio).

  • Não deve haver caracteres isolados de marcação inicial ( < ou & ) em seus dados de texto. Eles devem ser dados como &lt; e &amp; Respectivamente, e a seqüência ]] > só pode ocorrer como o fim de uma seção marcada pelo CDATA: se você estiver usando isso para qualquer outro propósito, ele deve ser dado como ]] &gt; .

  • Os elementos devem aninhar-se um no outro corretamente (sem marcação sobreposta, igual que para HTML);

  • DTDless documentos bem-formados podem usar atributos em qualquer elemento, mas os atributos são assumidos como de tipo CDATA. Você não pode usar os tipos de atributo ID / IDREF para consulta cruzada verificada por analisador em documentos DTDless.

  • Os arquivos XML sem DTD são considerados como tendo &lt; , &gt; , &apos; , &quot; , e &amp; Predefinido e, portanto, disponível para uso. Com uma DTD, todas as entidades de caracteres utilizadas devem ser declaradas, incluindo estas cinco.

XML Válido

Os arquivos XML válidos são arquivos bem formados que possuem uma Definição de Tipo de Documento (DTD) ou Schema e que estão de acordo com ele. Eles já devem estar bem formados , então todas as regras acima se aplicam.

Um arquivo válido começa com uma Declaração de Tipo de Documento especificando um DTD, ou código que especifica um Schema do W3C. Pode ter uma Declaração XML opcional pré-adicionada.


<?xml version="1.0"?> 
<!DOCTYPE advert SYSTEM "http://www.foo.org/ad.dtd"> 
<advert>
  <headline>...<pic/>...</headline> 
  <text>...</text>
</advert> 
      

A Especificação XML predefini uma Declaração SGML para XML que é corrigida para todas as instâncias e, portanto, é codificada em todos os softwares XML e nunca foi especificada separadamente (exceto quando se usa um validador comutável SGML / XML como onsgmls: veja abaixo).

Peter Flynn writes:

A Declaração SGML para XML foi removida do texto da Especificação, mas está disponível como um documentos separado ). Como isso parece sofrer ocasionalmente de bitrot ou negligência, há uma cópia aqui (WebSGML TC) e aqui Extended Namins Rules TC) , e uma versão para onsgmls   aqui .

O DTD especificado deve ser acessível ao processador XML usando o URI fornecido no Identificador do SYSTEM, seja por estar disponível localmente (ou seja, o usuário já possui uma cópia no disco) ou por ser recuperável através da rede. Observe que as especificações DTD devem ser URIs (local, relativo ou absoluto). As referências do sistema de arquivos específicas específicas (por exemplo C:\dtds\my.dtd não são URIs e não podem ser usadas: use o formato do arquivo file:///C|/dtds/my.dtd em vez disso.

É possível (muitas pessoas diriam preferível) para fornecer um identificador público formal com a palavra-chave PUBLIC e usar um catálogo XML para desreferê-lo, mas a Especificação exige um identificador do SYSTEM, então isso ainda deve ser fornecido após o identificador PUBLIC: não mais Palavra-chave é necessária. Um identificador PUBLIC constitui uma reivindicação de propriedade apenas do identificador, e não da própria DTD (embora muitos casos estejam implícitos).


<!DOCTYPE advert PUBLIC  
   "+//Silmaril//DTD Foo Corp Advertisements//EN"
   "http://www.foo.org/ad.dtd"> 
<advert>...</advert>
    

O teste de validade é que um analisador de validação não encontra erros no arquivo: ele deve estar absolutamente de acordo com as definições e declarações na DTD.

Os esquemas XML (W3C) geralmente não são vinculados diretamente de uma instância de documento XML da maneira que DTDs são: o Esquema relevante (arquivo XSD) para uma instância de documento normalmente é especificado para o analisador separadamente, seja por referência de sistema de arquivo ou usando Um Target Namespace .