2010-08-27 11 views
5

sto cercando di produrre il seguente XML mediante DOM/PHP5:Come dichiarare un prefisso dello spazio dei nomi XML con DOM/PHP?

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

Questo è quello che sto facendo:

$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(); 

Questo è quello che sto ottenendo:

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

Cosa sto sbagliando? Come far funzionare questo prefisso?

risposta

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

root non dovrebbe essere nel namespace myNS. Nell'esempio originale, non è in alcun spazio dei nomi.

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

impostare un qualifiedName di p:x invece di x per suggerire l'algoritmo serializzazione che si desidera utilizzare p come prefisso per questo spazio dei nomi. Tuttavia, si noti che per un lettore compatibile con XML-with-Namespace non c'è differenza semantica se viene utilizzato o meno p:.

Ciò causerà la produzione della dichiarazione xmlns:p sull'elemento <p:x> (il primo che ne ha bisogno). Se si desidera che la dichiarazione sia presente sull'elemento radice (di nuovo, non c'è differenza per un lettore XML-with-Namespaces), sarà necessario farlo esplicitamente in setAttributeNS. es .:

$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 l'hai spiegato molto bene e questa sola risposta mi ha davvero aiutato a capire come funzionano veramente gli spazi dei nomi in PHP DOM! – thomasrutter

Problemi correlati