2

名前空間を持つ属性をDOMNodeから削除しようとかなりの時間を費やしましたが、まったく機能していません。

xmlはデータベースから生成され、次のようになります。

<dictionary>

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <table>answers</table>
  <entity>Answer</entity>
</row>

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <table>file_trans</table>
  <entity>FileTrans</entity>
</row>

...
</dictionary>

削除しようとしている属性名は明らかに「xmlns:xsi」です。postgres dbはそれを自動的に追加し、そこで削除できなかったので、phpで仕事をしようとしています。

xmlをDOMDocumentとしてロードしてから、すべての行要素に対してforeachサイクルを実行します。

$xml = new DOMDocument();
$xml->loadXML($tablesInXml['xmlelement'], LIBXML_NOBLANKS);

foreach($xml->documentElement->childNodes as $row) {
  $row->removeAttribute('xsi');  // not working
  $row->removeAttribute('xmlns:xsi'); // not working
...

DOMNodeプロパティ属性をスカウトしようとしましたが、属性がまったく含まれておらず、長さが0でした。

これはphp5.3のバグですか?誰か他に何ができるか知っていますか?

答えてくれてありがとう

4

2 に答える 2

2

を使用してこれを簡単な方法で行うことはできませんDOMDocument。これらは実際には「属性」ではありません(DOMに属性として表示されず、XMLインフォセットの一部ではありません)。それらはむしろ名前空間宣言であり、xmlシリアル化の外には存在しません。最も重要なことは、それらがDOMで表現されていないことです。

libxml2(DOMDocumentの基礎となるxmlライブラリ)は、これらの「名前空間ノード」を内部的に追跡しますが、それらへのパブリックインターフェイスを公開しません。したがって、ノードを複製またはインポートすると、見えなくてもxml名前空間宣言が続きます。

古いバージョンのPHPには、を使用してこれらのノードを削除できるバグがあったようですがremoveAttributeNS、これは修正されています。このメソッドについては、PHPドキュメントのコメントを参照してください。

私の意見:これらのノードを取り除こうとすべきではありません。それはあなたの時間の価値がなく、それらを残すことは何も害はありません。

ただし、本当にそれらを取り除きたい場合は、別のアプローチを使用する必要があります。これを行う1つの方法は、DOMツリー全体を新しいDOMドキュメントに手動でディープコピーすることです。を使用createElementNSし、コピーするときに(またはsetAttributeNSを使用する代わりに)、非表示の名前空間ノードはコピーに作成されません。面倒なので、これを行うためのコードを書くつもりはありません。importNodecloneNode

このstackoverflowの回答は、xsltソリューションを示唆しています。XSLT 1.0はこれらの名前空間宣言「ノード」も公開しないため、機能するかどうかはわかりません。

アップデート

冗長なXMLノードを削除するだけでなく、XMLに対して他の処理を行っても問題がない場合はXMLの正規化を試すことができます。Canonical XMLの目的は、同じXML情報セットが常に同じXML出力文字列を生成するようにすることです。(これは、XMLファイルの比較やチェックサムハッシュの作成などに役立ちます。)ただし、自己終了タグを使用しないなどのことも行います。

試してみてください:

$d = new DOMDocument();
$d->loadXML($xml, LIBXML_NOBLANKS);
echo $d->C14N(true, false);

ドキュメンテーション:

于 2012-10-16T19:48:55.727 に答える
-3

removeAttributeNSメソッドを使用する必要があります。

$row->removeAttributeNS('xmlns:xsi');

詳細については、マニュアルを参照してください:http ://www.php.net/manual/en/domelement.removeattributens.php

于 2012-10-16T18:30:31.963 に答える