Solução de problemas de formato de documento Existem dezenas, senão centenas, de receitas na lista de minha mãe. Se ocorrer um erro fatal, a depuração será muito difícil - você procurará o marcador ausente linha por linha. Se você usar vários níveis de aninhamento, será difícil encontrar erros.
Mas uma boa ajuda pode ser encontrada. Analisadores – Aplicativos que analisam código XML e relatam erros malformados estão disponíveis gratuitamente online. O melhor deles é Lark, escrito por Tim Bray – editor técnico e defensor vocal da especificação XML, uma das pessoas mais inteligentes do planeta.
Estou usando o Lark para analisar o código abaixo. Observe que "chocolate chips" e sua tag de fechamento aparecem na posição errada dentro da tag </ingredients>:
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >Barras de chocolate</recipe_name>
<meal>Jantar
<course>Sobremesa</course>
</meal>
<ingredientes>
<item>2/3 C de manteiga</item>
<item>2 C de açúcar mascavo</ item>
<item>1 colher de chá de baunilha</item>
<item>1 3/4 C de farinha de trigo não peneirada</item>
<item>1 1/2 colher de chá de fermento em pó</item>
<item>1/2 colher de chá de sal< /item>
<item>3 ovos</item>
<item>1/2 C de nozes picadas</item>
<item>
</ingredients>2 xícaras (pacote de 12 onças)
de chips de chocolate meio amargo< /item. >
<instruções>
Pré-aqueça a 350 graus. Derreta a manteiga e
misture com o açúcar mascavo e a
baunilhae bata bem
.
Acrescente
os ingredientes secos reservados, as nozes e as batatas fritas.
Espalheem
uma
assadeira untada de 13 por 9 polegadas. Asse por 25 a 30 minutos
até
dourar.
list>
A seguir estão os resultados retornados pelo analisador:
Relatório de erros
Linha 17, coluna 22: Encontrado </ingredientes> esperado </item>
... assumido </item>
Linha 18, coluna 36: Encontrado </item> com sem tag inicial.
Com essas informações, encontrar o erro não será um problema. Então, o que significa a validade de um arquivo XML?
Implementando a Eficácia Em última análise, adicionaremos informações a um documento XML bem organizado. Na verdade, temos muito que fazer - ainda há crises à espreita - e embora o arquivo XML esteja bem organizado,
Mas informações críticas também podem ser perdidas. Dê uma olhada no seguinte exemplo:
<receita>
<autor>Carol Schmidt</autor>
<recipe_name>Barras de chocolate</recipe_name>
<refeição>Jantar <course>Sobremesa</course> </meal>
<ingredientes> </ingredientes>
<directions>Derreta a manteiga, misture com, etc. ... </directions>
</receita>
Esta receita não inclui ingredientes e por ser tão bem organizada
O analisador Lark também não encontrará o problema. Qualquer pessoa que tenha gerenciado até mesmo o mais benigno dos bancos de dados sabe o erro que nós, humanos, cometemos: se tivermos oportunidade, jogamos fora informações críticas e acrescentamos bobagens inúteis. É por isso que o inventor do XML introduziu o DTD -
Definição de tipo de documento. DTDs fornecem uma maneira de garantir que o XML seja mais ou menos o que você deseja.
Vejamos um DTD usado em receitas.
<!DOCTYPE lista [
<!ELEMENT receita (nome_da_receita, autor, refeição, ingredientes, instruções)>
<!ELEMENT ingredientes (item+)>
<!ELEMENT refeição (#PCDATA, claro?)>
<!ELEMENT item (#PCDATA, sub_item*)>
<!ELEMENT nome_da_receita (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!Curso ELEMENT (#PCDATA)>
<!ELEMENTitem (#PCDATA)>
<!Subitem ELEMENT (#PCDATA)>
<!ELEMENT direções (#PCDATA)>
]>
O código pode parecer hostil no início, mas faz sentido quando você o analisa. Vamos explicar em detalhes:
<!DOCTYPE list [
Esta linha diz que o que está entre colchetes é um documento com o elemento raiz <list>
DTD. Como mencionamos antes, o elemento raiz contém todos os outros elementos.
<!ELEMENT receita (recipe_name, refeição, ingredientes, instruções)>
Esta linha define a tag <recipe>. Os parênteses significam que as quatro tags devem aparecer na tag <recipe> em ordem.
<!ELEMENT refeição (#PCDATA, claro?)>
Esta linha precisa de explicação detalhada. Defini a seguinte estrutura:
<refeição>Aqui o nome da refeição é obrigatório
<course>Um nome de curso pode aparecer, mas não é
obrigatório</curso>
</refeição>
Faço isso porque, a meu ver, o almoço não precisa necessariamente ser um prato específico, mas o jantar pode incluir entradas, pratos principais e sobremesas. Ao especificar
#PCDATA – Representa dados de caracteres analisados (ou seja, dados não binários) para implementar esta funcionalidade. Aqui, #PCDATA é texto – por exemplo, “jantar”.
O ponto de interrogação após "curso" indica que 0 ou 1 par de tags <curso> aparecerão em <refeição>
dentro do marcador.
Agora vamos dar uma olhada na próxima linha:
<!ELEMENT ingredientes (item+)>
O sinal de mais aqui indica que pelo menos um par de tags <item> deve aparecer em <ingredientes>
dentro do marcador.
A última linha que nos interessa é:
<!ELEMENT item (#PCDATA, sub_item*)>
Coloquei sub_item* como medida de segurança. Além de pedir o texto de cada item, desejo contar a quantidade de conteúdo de cada item. O asterisco indica o número de subitens que podem ser incluídos na tag <item>. Não preciso de nenhum subitem para a receita das Barras de Chocolate, mas isso é útil quando os ingredientes são complexos.
Agora vamos juntar isso e ver o que obtemos.
Exemplo completo de DTD Abaixo está um exemplo completo. Adicionei outra receita ao arquivo e adicionei
O DTD é anotado. Você pode notar que usei subitens na segunda receita.
<?xml versão="1.0"?>
<!--Isso inicia o DTD As primeiras quatro linhas abordam a estrutura do documento-->.
<!Lista DOCTYPE ][
<!ELEMENT receita (nome_da_receita, autor, refeição, ingredientes, instruções)>
<!ELEMENT ingredientes (item+)>
<!ELEMENT refeição (#PCDATA, claro?)>
<!ELEMENT item (#PCDATA, sub_item*)>
<!--Estes são os elementos restantes da tag de receita -->
<!ELEMENT nome_da_receita (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT direções (#PCDATA)>
<!--O elemento restante da etiqueta de refeição -->
<!Curso ELEMENT (#PCDATA)>
<!--O elemento restante da tag do item -->
<!ELEMENT sub_item (#PCDATA)>
]>
<?xml versão="1.0"?>
<lista>
<receita>
<autor>Carol Schmidt</autor>
<recipe_name>Barras de chocolate</recipe_name>
<refeição>Jantar
<curso>Sobremesa</curso>
</refeição>
<ingredientes>
<item>2/3 C de manteiga</item>
<item>2 C de açúcar mascavo</item>
<item>1 colher de chá de baunilha</item>
<item>1 3/4 C de farinha de trigo não peneirada</item>
<item>1 1/2 colher de chá de fermento em pó</item>
<item>1/2 colher de chá de sal</item>
<item>3 ovos</item>
<item>1/2 xícara de nozes picadas</item>
<item>2 xícaras (pacote de 12 onças) de chips semi-doces</item>.
</ingredientes>
<direções>
Pré-aqueça o forno a 350 graus.
misture com açúcar mascavo e baunilha em uma tigela grande.
Deixe esfriar. Misture a farinha, o fermento e o sal;
reserve. Adicione os ovos à mistura de açúcar resfriada e bata bem.
Junte os ingredientes secos reservados, nozes e batatas fritas.
Espalhe em uma assadeira untada de 13 por 9 polegadas.
Asse por 25 a 30 minutos até dourar;
Corte em quadrados.
</direções>
</receita>
<receita>
<recipe_name>Macarrão com molho de tomate</recipe_name>
<refeição>Jantar
<curso>Entrada</curso>
</refeição>
<ingredientes>
<item>1 quilo de espaguete</item>
<item>1 lata de 16 onças de tomate em cubos</item>
<item>4 dentes de alho</item>
<item>1 cebola picada</item>
<item>Tempero italiano
<sub_item>orégano</sub_item>
<sub_item>manjericão</sub_item>
<sub_item>pimentão vermelho esmagado</sub_item>
</item>
</ingredientes>
<direções>
Ferva o macarrão. Refogue o alho e a cebola.
Adicione os tomates. Sirva quente.
</direções>
</receita>
</lista>
Agora que existe uma DTD, o documento será verificado para verificar se está em conformidade com as restrições definidas pela DTD. Em outras palavras, queremos garantir a validade do documento.
Para conseguir isso, precisamos de outra ferramenta: um analisador de validade. O MSXML da Microsoft, um programa baseado em Java, é fácil de usar e funciona bem. O documento acima foi verificado por este programa e nenhum erro foi encontrado. Mas se eu verificar um
Receitas que não contenham um item na etiqueta de ingrediente retornarão a seguinte mensagem:
ingredientes não completos Elementos esperados [item].