ルート要素にダミーの属性を追加する必要がない場合は、接頭辞のxmlns
属性を追加して名前空間を手動で宣言できます。i
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
これを行うには、既存の回答 ( Unable to add Attribute with Namespace Prefix using PHP Simplexml ) で示唆されているように、新しい属性にプレフィックスを付ける必要がありますxmlns:
(xmlns:
ドキュメントで名前空間プレフィックスが宣言されていないため)。はその属性の名前の一部であるためxmlns:
、2 回出現する必要があります。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();
与えます(読みやすくするために手動でフォーマットされています):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
</root>
したがって、このxmlns:
接頭辞はごまかしているようです。その属性を設定した後に要素をリロードすると、子を追加するときに名前空間 uri も使用できることに注意してください。これはプレフィックスを指定せずに行います。
$root = new SimpleXMLElement( $root->asXML() );
$child = $root->addChild('foo');
$child->addAttribute( 'i:bar', 'bazy', $uri );
####
echo $root->asXml();
与えます(これも手動でフォーマットされています):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
<foo i:bar="bazy"/>
</root>
この 2 番目の例は、意図した (または少なくとも予想される) 用途に近いようです。
これを適切に行う唯一の方法は、より完全な (残念ながら、より複雑で冗長な) DOMDocumentクラスを使用することです。これは、DOM/PHP で XML 名前空間プレフィックスを宣言する方法で概説されています。.