11

以下で属性として追加しようとしたときに、Atomフィードを作成しxmlns:iています-

$node->addAttribute("xmlns:i","http://www.w3.org/2001/XMLSchema-instance"); 

これを出力として取得しました-

i="http://www.w3.org/2001/XMLSchema-instance"

"xmlns:"の部分が切り取られました。-文字をエスケープする必要があり:ますか? または、この名前空間を追加する他の方法はありますか?

4

3 に答える 3

22

名前空間/プレフィックスから $node に属性を追加したい場合はi、事前に名前空間を宣言する必要はありません。addAttribute() の 3 番目のパラメーターを使用して、最初のパラメーターで使用しているプレフィックスの名前空間 uri を指定するだけです。

$node = new SimpleXMLElement('<root></root>');
$node->addAttribute("i:somename", "somevalue", 'http://www.w3.org/2001/XMLSchema-instance'); 
echo $node->asXml();

版画

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:somename="somevalue"/>

属性自体が不要な場合はunset()、名前空間宣言を残して で削除できます。

unset($node->attributes('i', TRUE)['somename']);
于 2009-10-20T08:07:27.777 に答える
20

ルート要素にダミーの属性を追加する必要がない場合は、接頭辞の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 名前空間プレフィックスを宣言する方法で概説されています。.

于 2012-02-22T08:53:32.597 に答える