Nedeklarovaný prefix: prefix is not bound

Prefix ve jménu elementu nebo atributu (p:kniha) není navázaný na URI jmenného prostoru, protože chybí deklarace xmlns:p na tomto elementu ani na žádném předkovi. Java hlásí The prefix "p" for element "p:kniha" is not bound, libxml2 (PHP, xmllint) Namespace prefix p on kniha is not defined, .NET 'p' is an undeclared prefix a česká verze Firefoxu Prefix není svázán se jmenným prostorem.

Autor: Aktualizováno

Znění hlášky v jednotlivých parserech

Parser Hláška Kdy
libxml2 2.13 a novější PHP (DOM, SimpleXML), xmllint, Python lxml, validátor na XML.cz Namespace prefix p on kniha is not defined Prefix elementu bez deklarace
Namespace prefix x for id on kniha is not defined Prefix atributu bez deklarace
Java (Xerces) DocumentBuilder, SAXParser, JAXB, Spring, Maven The prefix "p" for element "p:kniha" is not bound. Prefix elementu bez deklarace
The prefix "x" for attribute "x:id" associated with an element type "kniha" is not bound. Prefix atributu bez deklarace
Python (expat) xml.etree.ElementTree, minidom unbound prefix: line 1, column 0 Prefix elementu bez deklarace, Prefix atributu bez deklarace
.NET XmlDocument, XDocument, XmlReader 'p' is an undeclared prefix. Line 1, position 2. Prefix elementu bez deklarace
'x' is an undeclared prefix. Line 1, position 8. Prefix atributu bez deklarace
Chrome 151+ DOMParser, zobrazení XML souboru Element p:kniha prefix is unbound Prefix elementu bez deklarace
Attribute x:id prefix is unbound Prefix atributu bez deklarace
Firefox (česky) DOMParser, zobrazení XML souboru v české verzi Chyba parsování XML: Prefix není svázán se jmenným prostorem Prefix elementu bez deklarace, Prefix atributu bez deklarace

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:

PHP 8.4: dokument se načte jen s varováním
$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

Chybně
<p:kniha/>
Opraveno
<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

Chybně
<kniha x:id="k1"/>
Opraveno
<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

Deklarace se dědí z předka
<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í).