Jeśli nie chcesz mieć dodać atrybut atrapę do elementu głównego, można zadeklarować na niej nazw ręcznie dodając atrybut xmlns
dla prefiksu i
:
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
Aby to zrobić i jako podpowiedź w istniejącej odpowiedzi (Unable to add Attribute with Namespace Prefix using PHP Simplexml), musisz poprzedzić nowy atrybut wartością xmlns:
(ponieważ prefiks przestrzeni nazw o nazwie xmlns:
nie jest zadeklarowany w dokumencie). A ponieważ xmlns:
jest częścią nazwy tego atrybutu, to therfore potrzebne są dwa wystąpienia 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();
Daje (sformatowane ręcznie dla czytelności):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
</root>
Więc to xmlns:
Prefiksacja wydaje się go oszukać. Zauważ, że jeśli przeładować element po ustawienie tego atrybutu, możliwe jest korzystanie z URI przestrzeni nazw, jak również podczas dodawania dzieci, i to bez podania prefiksu:
$root = new SimpleXMLElement($root->asXML());
$child = $root->addChild('foo');
$child->addAttribute('i:bar', 'bazy', $uri);
####
echo $root->asXml();
daje (ponownie, sformatowany ręcznie):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
<foo i:bar="bazy"/>
</root>
Ten drugi przykład wydaje się bliższy zamierzonemu (lub przynajmniej oczekiwanemu) użyciu.
Należy pamiętać, że jedynym sposobem, aby to zrobić poprawnie, byłoby użycie bardziej kompletnych (ale niestety również bardziej złożonych i bardziej szczegółowych) klas DOMDocument. Jest to opisane w How to declare an XML namespace prefix with DOM/PHP?.
To wydaje się taki odpadów. To deklaruje przestrzeń nazw w każdym wierszu zamiast tylko na root. –
Myślę, że dodaje do atrybutu "dummy", aby przekonać SimpleXMLElement do dodania deklaracji przestrzeni nazw. Brzydki (ale błąd PHP, nie VolkerK), ale działa, jeśli nie masz nic przeciwko dodatkowemu atrybutowi. –
Najlepszym rozwiązaniem jest to, które oferuje Olivier 'Ölbaum' Scherler –