Si no quieren tener que añadir un atributo ficticio a su elemento raíz, se puede declarar el espacio de nombres de forma manual en él mediante la adición de un atributo xmlns
para su i
prefijo:
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
Para hacerlo, y como se insinuó en una respuesta existente (Unable to add Attribute with Namespace Prefix using PHP Simplexml), debe anteponer el nuevo atributo al xmlns:
(ya que el espacio de nombres xmlns:
no está declarado en su documento). Y puesto que xmlns:
es parte del nombre de ese atributo, therfore necesita dos apariciones de xmlns:
$uri = 'http://www.w3.org/2001/XMLSchema-instance';
$root = new SimpleXMLElement('<root/>');
$root->addAttribute('xmlns:xmlns:i', $uri);
######
$child = $root->addChild('foo');
$child->addAttribute('xmlns:i:bar', 'baz');
######
echo $root->asXml();
Gives (formato manualmente para facilitar la lectura):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
</root>
Así que este xmlns:
prefijar parece tramposo ella. Tenga en cuenta que si vuelve a cargar el elemento después establecimiento de ese atributo, es posible utilizar el URI de espacio de nombres, así cuando se añaden los niños, y esto sin especificar el prefijo:
$root = new SimpleXMLElement($root->asXML());
$child = $root->addChild('foo');
$child->addAttribute('i:bar', 'bazy', $uri);
####
echo $root->asXml();
Da (de nuevo, el formato manualmente):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
<foo i:bar="bazy"/>
</root>
Este segundo ejemplo parece estar más cerca del uso previsto (o al menos esperado).
Tenga en cuenta que la única manera de hacer esto correctamente sería utilizar las clases más completas (pero desafortunadamente también más complejas y más detalladas) DOMDocument. Esto se describe en How to declare an XML namespace prefix with DOM/PHP?.
Este parece ser un desperdicio. Está declarando el espacio de nombres en cada línea en lugar de solo la raíz. –
Creo que está agregando un atributo ficticio a la raíz, solo para convencer a SimpleXMLElement de que agregue la declaración del espacio de nombres. Feo (pero culpa de PHP, no de VolkerK) pero funciona si no te importa el atributo extra. –
La mejor solución es realmente la proporcionada por Olivier 'Ölbaum' Scherler –