2010-08-27 4 views
5

Ich versuche, die folgende XML mittels DOM/PHP5 zu produzieren:Wie deklariere ich ein XML-Namespacepräfix mit DOM/PHP?

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

Das ist, was ich tue:

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

Dies ist, was ich bin immer:

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

Was mache ich falsch? Wie funktioniert dieses Präfix?

Antwort

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

root sollte nicht myNS im Namensraum sein. Im ursprünglichen Beispiel befindet es sich in keinem Namespace.

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

eine qualifiedName von p:x Sets statt nur x auf die Serialisierung Algorithmus vorzuschlagen, die Sie für diesen Namensraum p als Präfix verwenden. Beachten Sie jedoch, dass bei einem XML-mit-Namespaces-fähigen Lesegerät kein semantischer Unterschied besteht, ob p: verwendet wird oder nicht.

Dies wird dazu führen, dass die xmlns:p Deklaration auf das Element <p:x> (das erste, das es benötigt) ausgegeben wird. Wenn Sie möchten, dass die Deklaration stattdessen auf dem Stammelement steht (auch hier besteht kein Unterschied zu einem XML-with-Namespaces-Reader), müssen Sie dies explizit setAttributeNS. zB:

$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, du hast das wirklich gut erklärt und diese eine Antwort hat mir wirklich geholfen zu verstehen, wie Namespaces wirklich in PHP DOM funktionieren! – thomasrutter