Znění hlášky v jednotlivých parserech
Podle specifikace jmenných prostorů jde o chybu: dokument je možná dobře utvořený podle XML 1.0,
ale není „namespace-well-formed“. Java, Python, .NET i prohlížeče ho odmítnou. libxml2 chybu
ohlásí, ale dokument načte dál, takže PHP vrátí z load() hodnotu true
a element nemá žádný jmenný prostor:
$dom = new DOMDocument();
$ok = $dom->load('kniha.xml'); // true, jen Warning: Namespace prefix p on kniha is not defined
echo $dom->documentElement->nodeName; // p:kniha
var_dump($dom->documentElement->namespaceURI); // NULL
XPath dotaz s prefixem pak takový element nenajde. Varování libxml2 proto nepřehlížej, zachytíš
ho přes libxml_use_internal_errors(true) a libxml_get_errors().
Příčiny a opravy
Prefix elementu bez deklarace
<p:kniha xmlns:p="urn:example:knihy"/>
Hledej xmlns:p na uzlu nebo jeho předcích. Deklarace na sourozenci neplatí.
Nevybírej libovolné URI jen pro umlčení chyby: příjemce rozlišuje rozšířené jméno (URI +
místní jméno), ne prefix.
Prefix atributu bez deklarace
<kniha xmlns:x="urn:example:x" x:id="k1"/>
U atributu platí totéž. Rozdíl je jen v tom, že atribut bez prefixu do výchozího jmenného
prostoru nepatří nikdy, takže xmlns="…" prefix atributu nenahradí (viz
jmenné prostory).
Chyba po vyříznutí části dokumentu
<katalog xmlns:k="urn:example:knihy"><k:kniha/></katalog> Celý dokument má prefix k deklarovaný. Pokud však zkopíruješ pouze text značky k:kniha do nového souboru, deklarace předka v něm nebude. Při vytváření samostatného dokumentu přenes i potřebné deklarace jmenných prostorů.
Prefix si nevybírá význam sám: potřebuje správné URI. U opravy proto vycházej z původního dokumentu nebo specifikace formátu. Přidaný prefix v XPath dotazu se váže samostatně a nemusí se jmenovat stejně jako ve vstupu (viz XPath nic nevrací).