2011-12-07 32 views
2

子ノードの親ノードは削除しますが、すべての子ノードを保持するにはどうすればよいですか?子ノードの子ノードを削除するPHP domDocument

XMLファイルはこれです:

<?xml version='1.0'?> 
<products> 
<product> 
<ItemId>531<ItemId> 
<modelNumber>00000</modelNumber> 
<categoryPath> 
<category><name>Category A</name></category> 
<category><name>Category B</name></category> 
<category><name>Category C</name></category> 
<category><name>Category D</name></category> 
<category><name>Category E</name></category> 
</categoryPath> 
</product> 
</products> 

基本的に、私はcategoryPathノードとカテゴリノードを削除しますが、製品のノードの内部で名前のすべてのノードを維持する必要があります。私が目指しているのは次のような文書です:

<?xml version='1.0'?> 
<products> 
<product> 
<ItemId>531<ItemId> 
<modelNumber>00000</modelNumber> 
<name>Category A</name> 
<name>Category B</name> 
<name>Category C</name> 
<name>Category D</name> 
<name>Category E</name> 
</product> 
</products> 

PHPはこれを行うために組み込まれていますか?どのポインターも高く評価されますが、多くの子ノードがあるため、どこから開始するのか分かりません。

おかげ

答えて

0

XMLデータを処理するための良い方法は、DOM機能を使用することです。

初めて紹介されるととても簡単です。たとえば、次のように

<?php 

// load up your XML 
$xml = new DOMDocument; 
$xml->load('input.xml'); 

// Find all elements you want to replace. Since your data is really simple, 
// you can do this without much ado. Otherwise you could read up on XPath. 
// See http://www.php.net/manual/en/class.domxpath.php 
$elements = $xml->getElementsByTagName('category'); 

// WARNING: $elements is a "live" list -- it's going to reflect the structure 
// of the document even as we are modifying it! For this reason, it's 
// important to write the loop in a way that makes it work correctly in the 
// presence of such "live updates". 
while($elements->length) { 
    $category = $elements->item(0); 
    $name = $category->firstChild; // implied by the structure of your XML 

    // replace the category with just the name 
    $category->parentNode->replaceChild($name, $category); 
} 

// final result: 
$result = $xml->saveXML(); 

See it in action

+0

ありがとうございます。他のすべてのカテゴリタグを削除するだけだとわかりました。それは起こるはずですか? – Ben

+0

@Ben:実際には、これを修正するためにもう一度私に教えてください。 – Jon

+0

@Ben:修正されました。私は、DOMNodeListのいくつかの面白い...の動作に遭遇しました。起こったことの説明については、[this](http://www.php.net/manual/en/domdocument.getelementsbytagname.php#99716)を参照してください。そのコメントに示されているように 'for'を書き換えて問題を解決することができましたが、何が起こっているのか分からなくても自然なように見えるので、' while 'を優先しました。必要とされている。 – Jon

関連する問題