2

簡単な作業が<places>あります。XMLドキュメントからノードとその子孫を削除し、他のノードは残します。

このコードを試しましたが、機能しませんでした...

$document->preserveWhiteSpace = false; 
$books = $xpath->query('piletilve_info/places');
//echo "4";

foreach ($books as $places) {
    while($places->hasChildNodes()) {
        $places->removeChild($places->childNodes->item(0));
    }

    $places->parentNode->removeChild($places);
}

処理されるソースXML:

<piletilve_info>
   <places>
      <place>
        ...
      </place>
   </places>
   <other node>
      ...
   </other node>
</piletilve_info>

実際のデータには、配置されていないノードがさらにありますが、簡単にするために、この例では少数しか示していません。

C#の例を見ましたが、コードをPHPに移植することができません。

明確化:コードスニペットでは、変数$booksはクエリされたリストの単なるホルダーです。名前には意味がありません。

4

2 に答える 2

4

目標は、他のノードを残してノード全体を削除することです(実際にはもっとありますが、簡単にするために、この例ではすべてを示しています

$dom = new DOMDocument;
$dom->load('places.xml');
foreach ($dom->getElementsByTagName('places') as $places)
{
    $places->parentNode->removeChild($places);
}
echo $dom->saveXml();

<places>子を含む、ドキュメント内のすべての要素を削除します。

出力:

<?xml version="1.0"?>
<piletilve_info>

   <other>
      ...
   </other>
</piletilve_info>
于 2010-11-14T12:13:25.110 に答える
1

受け入れられた回答を使用していたとき、タグのすべての出現箇所が削除されるわけではありませんでした。foreachは内部配列ポインターに依存しており、ループ内でそれを変更すると予期しない動作が発生するため、foreachループはタグをスキップします。

私が見つけた実用的なソリューションは次のようになります。

$dom = new DOMDocument;
$dom->load('places.xml');
$placesNodes = $dom->getElementsByTagName('places') 
while ($placesNodes->length > 0) {
    $node = $placesNodes->item(0);
    $node->parentNode->removeChild($node);
}
echo $dom->saveXml();
于 2019-03-19T21:17:51.497 に答える