Se non si desidera avere per aggiungere un attributo fittizio per il vostro elemento principale, è possibile dichiarare il namespace manualmente su di esso con l'aggiunta di un attributo xmlns
per la vostra i
prefisso:
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
Per fare ciò, e come suggerito in una risposta esistente (Unable to add Attribute with Namespace Prefix using PHP Simplexml), è necessario aggiungere il prefisso al nuovo attributo con xmlns:
(poiché lo spazio dei nomi non è dichiarato nel documento xmlns:
). E poiché xmlns:
è parte del nome di tale attributo, è therfore bisogno di due ricorrenze di 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();
Dà (formattati manualmente per migliorare la leggibilità):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
</root>
Quindi questo xmlns:
prefisso di sembra di barare esso. Si noti che se si ricarica l'elemento dopo impostazione tale attributo, è possibile utilizzare l'URI dello spazio dei nomi, così quando si aggiungono i bambini, e questo senza specificare il prefisso:
$root = new SimpleXMLElement($root->asXML());
$child = $root->addChild('foo');
$child->addAttribute('i:bar', 'bazy', $uri);
####
echo $root->asXml();
Gives (di nuovo, formattato manualmente):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
<foo i:bar="bazy"/>
</root>
Questo secondo esempio sembra essere più vicino alla destinazione d'uso (o almeno atteso).
Si noti che l'unico modo per farlo correttamente sarebbe utilizzare le classi DOMDocument più complete (ma purtroppo anche più complesse e più dettagliate). Questo è delineato in How to declare an XML namespace prefix with DOM/PHP?.
Questo mi sembra un tale spreco. Sta dichiarando lo spazio dei nomi su ogni riga invece sulla sola radice. –
Penso che stia aggiungendo un attributo fittizio alla radice, solo per convincere SimpleXMLElement ad aggiungere la dichiarazione dello spazio dei nomi. Brutto (ma colpa di PHP, non di VolkerK) ma funziona se non ti dispiace l'attributo extra. –
La soluzione migliore è in realtà quella fornita da Olivier 'Ölbaum' Scherler –