4

SimpleXMLElement (実際には SimpleXMLElement のサブクラスである SimpleXMLIterator) の 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>

Web ブラウザーも XML パーサー (Xerces など) も、この余分なマークアップを気にしていないようですが、これをやめるように指示できないのは少し面倒です。

誰かが解決策を持っていますか、それとも私が過剰に反応していますか?

:}

4

1 に答える 1

7

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

親の名前空間の継承を防ぎ、空を省略するxmlnsは、親のような名前空間が必要ですxmlns="http://example.com"。次に$it->addChild('c', 'no ns', 'http://example.com')、あなたを与えます<c>no ns</c>

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

于 2011-01-12T18:43:50.810 に答える