2011-01-12 25 views
3

SimpleXMLElement(実際はSimpleXMLElementのサブクラスであるSimpleXMLIterator)のSimpleXMLのaddChildメソッドを使用して、子要素を追加しようとしています。PHP SimpleXML-> addChild - 不要な空の名前空間属性

私の問題は、ソースドキュメントに名前空間のある要素とない要素が混在していることです。ここでシンプル(しゃれが意図していない)の例です:

<?xml version="1.0" encoding="UTF-8"?> 
    <ns1:a xmlns:ns1="http://www.abc.com"> 
</ns1:a> 

PHPコードは次のとおりです。

$it = new SimpleXMLIterator ('./test.xml', 0, true); 
$it->addChild('d', 'another!'); // adds new child element to parent's NS 
$it->addChild('c', 'no namespace for me!', ''); // puts xmlns="" every time :(

//output xml in response: 
header('Content-Type: text/xml'); 

echo $it->saveXML(); 

問題 - コメント状態として - 私は子要素を配置したい場合ということです名前空間を持つ親要素の内側に、私は空のXML名前空間を取得する名前空間は、すべての時間(上記のPHPコードの出力を)属性ん:

<?xml version="1.0" encoding="UTF-8"?> 
    <ns1:a xmlns:ns1="http://www.abc.com"> 
    <ns1:d>another!</ns1:d> 
    <c xmlns="">no namespace for me!</c> 
</ns1:a> 

BOながらウェブブラウザ、XMLパーサ(例えば、 Xerces)はこの余分なマークアップに気にしていないようですが、私はこれをやめないように言わないように思われません。

誰かが解決策を持っているか、私は反応していますか?

:}

答えて

5

SimpleXMLの場合、名前空間が必要です。あなたが指定したものは、前に宣言されていないので、xmlns属性を取得します。 cの名前空間を指定しないと、親ノードから名前空間を継承します。唯一のオプションはns1です。 (これはDに発生します。)

を空の親の名前空間オミットのinhertanceを防ぐためにxmlnsあなたが親でxmlns="http://example.com"のような名前空間を必要とするだろう。その後、$it->addChild('c', 'no ns', 'http://example.com')<c>no ns</c>となります。

ただし、追加の名前空間を追加することはできません。 addAttributeとなります。 SimpleXMLで解析する前に入力ファイルを操作する必要があります。私にとっては、これは出力からすべての空のxmlns属性を削除するよりも醜いようです。

+0

Rik、まだ私に名前空間が必要ですが、あなたのソリューションは適切です - 特に私がHTMLを扱っている場合。あなたの迅速な返信とお返事ありがとう、ありがとうございます。 :D –