DTD (Document Type Definition)
DTD je další technologie podporovaná knihovnou libxml2. Je to jednoduchý jazyk na popis obsahu XML dokumentu. DTD může být součástí XML dokumentu (jako v příkladu config.xml), nebo může být v extra souboru, na který se XML odkazuje.
DTD vám říká, jaké elementy a atributy se mohou/musí v XML vyskytovat, v jakém pořadí a co může být jejich hodnotou.
DTD můžete použít pro kontrolu, zda XML dokument obsahuje to, co má. Alespoň přibližně. Novější jazyk pro popis XML, XML Schema dokáže popsat XML dokument podrobněji, ale není (zatím) podporován knihovnou libxml2.
Pokud dokument XML odpovídá XML pravidlům, říká se o něm, že je well-formed, tedy správně strukturovaný. Bez toho by vám nefungoval DOM ani SAX parser ani jiné XML nástroje.
Pokud obsah dokumentu XML odpovídá DTD (nebo XML Schema), říká se o něm, že je valid, tedy významově validní.
DTD můžete používat k tomu, aby vám program zkontroloval, že se v něm nachází to co má a neobsahuje, to co nemá. DTD ale taky vůbec používat nemusíte, když nechcete.
V této kapitole se nebudu zabývat popisem DTD jako takového (na to si najdětě jiný tutoriál), ale popíši, jak můžete XML dokument zvalidovat pomocí libxml2.
Dělá se to v zásadě zavoláním jedné funkce: xmlValidateDocument()
.
Tato funkce potřebuje odkaz na xmlDoc
strukturu, kterou získáte např. funkcí
xmlParseFile()
a na strukturu xmlValidCtxt
,
kterou získáte zavoláním xmlNewValidCtxt()
.
Tuto strukturu nakonec uvolníte voláním xmlFreeValidCtxt()
.
Funkce xmlValidateDocument()
defaultně vypisuje chyby na obrazovku.
Pokud se vám toto chování nehodí, můžete definovat funkce pro zpracování chyb
a varování a přiřadit odkazy na tyto funkce do kontextu xmlValidCtxt
.
Povinné to není, ale v příkladu níže jsem tyto funkce použil.
- /*------------------------------------------------*/
- /* 27cDtd/dtd.h */
- #include <stdio.h>
- #include <libxml/parser.h>
- #include <libxml/valid.h>
- va_list ap;
- }
- va_list ap;
- }
- xmlDocPtr doc;
- xmlValidCtxtPtr ctxt = xmlNewValidCtxt();
- int valid;
- ctxt->error = onError;
- ctxt->warning = onWarning;
- doc = xmlParseFile("config.xml");
- }
- valid = xmlValidateDocument(ctxt, doc);
- xmlFreeValidCtxt(ctxt);
- }
- /*------------------------------------------------*/
Nainstalujte si balíček libxml2-devel
. Bez toho tento příklad nepřeložíte.
Překlad může vypadat takto:
Výstup z programu je tentokrát trochu nudný:
Document je validní.
Zkuste si ale změnit config.xml tak, aby neodpovídal DTD a sledujte co se stane.
Třeba odstranění elementu minor
způsobí toto:
ERROR: Element version content does not follow the DTD, expecting (major , minor), got (major ) **** Dokument není validní.