2010-08-27 2 views
5

Je suis en train de produire le XML suivant au moyen de DOM/php5:Comment déclarer un préfixe d'espace de noms XML avec DOM/PHP?

<?xml version="1.0"?> 
<root xmlns:p="myNS"> 
    <p:x>test</p:x> 
</root> 

Voici ce que je fais:

$xml = new DOMDocument('1.0'); 
$root = $xml->createElementNS('myNS', 'root'); 
$xml->appendChild($root); 
$x = $xml->createElementNS('myNS', 'x', 'test'); 
$root->appendChild($x); 
echo $xml->saveXML(); 

Voici ce que je reçois:

<?xml version="1.0"?> 
<root xmlns="myNS"> 
    <x>test</x> 
</root> 

Qu'est-ce que je fais mal? Comment faire fonctionner ce préfixe?

Répondre

10
$root = $xml->createElementNS('myNS', 'root'); 

root ne devrait pas être dans l'espace de noms myNS. Dans l'exemple original, il n'y a pas d'espace de noms.

$x = $xml->createElementNS('myNS', 'x', 'test'); 

Définir un qualifiedName de p:x au lieu de simplement x de suggérer à l'algorithme de sérialisation que vous souhaitez utiliser p comme préfixe pour cet espace de noms. Notez cependant que pour un lecteur compatible XML-avec-Namespaces il n'y a pas de différence sémantique si p: est utilisé ou non.

La déclaration xmlns:p sera alors affichée sur l'élément <p:x> (le premier qui en a besoin). Si vous voulez que la déclaration soit sur l'élément racine à la place (encore une fois, il n'y a pas de différence avec un lecteur XML-with-Namespaces), vous devrez explicitement le setAttributeNS. par exemple:

$root = $xml->createElementNS(null, 'root'); 
$xml->appendChild($root); 
$x = $xml->createElementNS('myNS', 'p:x', 'test'); 
$root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:p', 'myNS'); 
$root->appendChild($x); 
+1

Wow, vous avez très bien expliqué cela et cette réponse m'a vraiment aidé à comprendre comment les espaces de noms fonctionnent vraiment en PHP DOM! – thomasrutter

Questions connexes