SimpleXMLElement
может только косвенно добавлять пространства имен.Поскольку вы можете добавлять только узлы элементов и атрибутов, а не объявления пространств имен, текстовые узлы или другие типы узлов, вы должны каким-то образом использовать SimpleXMLElement->addAttribute()
или SimpleXMLElement->addChild()
.Последний будет только добавлять новые пространства имен для дочернего элемента, поэтому здесь он бесполезен.addAttribute()
добавит пространство имен вместе с атрибутом к данному элементу, поэтому, если вы затем удалите атрибут, у вас останется пространство имен по вашему желанию.
Не существует очевидного метода удаленияатрибута, но использование unset
, как показано в нескольких ответах на « Удаление дочернего элемента с определенным атрибутом, в SimpleXML для PHP », можно адаптировать к задаче, используя SimpleXMLElement->attributes()
, чтобы получить ссылку на атрибут.
<?php
$rssXML = new SimpleXMLElement('<rss/>');
$rssXML->addAttribute("version", '2.0');
# add a dummy attribute to get the namespace
$rssXML->addAttribute("media:_", '', "http://search.yahoo.com/mrss/");
unset($rssXML->attributes('media', TRUE)[0]);
# and again
$rssXML->addAttribute("dcterms:_", '', "http://purl.org/dc/terms/");
unset($rssXML->attributes('dcterms', TRUE)[0]);
echo $rssXML->asXML(), "\n";
Результат:
<?xml version="1.0"?>
<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/" version="2.0"/>
Преимущество этого в том, что вы добавляете объявление пространства имен в качестве атрибута с подставленным поддельным пространством имен - оно обрабатываетсяв качестве пространства имен, а не атрибута, который в своем имени имеет нечто, похожее на префикс пространства имен.
var_export($rssXML->getDocNamespaces());
Результат:
array (
'media' => 'http://search.yahoo.com/mrss/',
'dcterms' => 'http://purl.org/dc/terms/',
)