2010-08-27 14 views
5

estoy tratando de producir el siguiente código XML mediante DOM/PHP5:¿Cómo declarar un prefijo de espacio de nombres XML con DOM/PHP?

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

Esto es lo que estoy haciendo:

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

Esto es lo que estoy haciendo:

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

¿Qué estoy haciendo mal? ¿Cómo hacer que este prefijo funcione?

Respuesta

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

root no debería estar en espacio de nombres myNS. En el ejemplo original, no está en ningún espacio de nombres.

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

Establecer un qualifiedName de p:x en lugar de sólo x sugerir al algoritmo de serialización que desea utilizar p como prefijo para este espacio de nombres. Sin embargo, tenga en cuenta que para un lector compatible con XML-with-Namespaces no existe diferencia semántica si se usa p: o no.

Esto causará que se emita la declaración xmlns:p en el elemento <p:x> (la primera que lo necesita). Si desea que la declaración esté en el elemento raíz en su lugar (de nuevo, no hay diferencia para un lector de espacios XML con espacios de nombres), tendrá que setAttributeNS explícitamente. eg .:

$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, lo has explicado muy bien y esta respuesta me ha ayudado realmente a entender cómo funcionan realmente los espacios de nombres en PHP DOM! – thomasrutter

Cuestiones relacionadas