2017-09-10 10 views
0

私のxmlファイルはこのように見えます - 私は(例のために簡略化したいです)すべてのノード値に1を加えて重複をチェックします。重複したノードが存在する場合は、親を削除してから、すべてを一意にxmlとして返します。XMLファイルノード値をsimpleXMLで操作した後、ノード値に重複が発生した場合、どのようにして親を削除するのですか?

<?xml version="1.0" encoding="UTF-8"?> 
<channel> 
<item> 
    <gid>1240</gid> 
</item> 
<item> 
    <gid>1440</gid> 
</item> 
<item> 
    <gid>1440</gid> 
</item> 
<item> 
    <gid>246</gid> 
</item> 

は、だから私の所望の出力は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<channel> 
<item> 
    <gid>1241</gid> 
</item> 
<item> 
    <gid>1441</gid> 
</item> 
<item> 
    <gid>247</gid> 
</item> 

私のコードは次のようになります - 操作部が解決されるが、私はかどうかを確認する方法を見つけ出すことはできませんnewは重複していて、その親をXMLとして返す前に削除します。私は、ループ内の配列としてすべての値を格納することは正しいと思いますが、それ以降は固まってしまいます。何か助けに感謝します。

<?php 

$xmllink = 'items.xml'; 

header("Content-type: text/xml"); 

$xml=simplexml_load_file($xmllink) or die("Error: Cannot create object"); 

$xml->channel; 

foreach ($xml as $anything) { 

// find the <gid> 
$newgid = $anything->gid; 

// manipulate <gid> 
$anything->gid = $newgid +1; 

// store all gid + 1 in array 
$allgids[] = $newgid;} 

echo $xml->asXML(); 

?> 

答えて

0

ドキュメントの構造を変更したい場合、SimpleXMLはあまり良くありません。

しかし、あなたは少しの作業ラウンドでそれを行うことができます。第1に、ドキュメントを同時に操作しようとすると、ドキュメントに対する操作が困難になります。 XPathを使用して項目のリストを取得し、そのリストを反復処理したのはこのためです。アイテムがすでに存在する場合は、unset()を使用して削除します。 (これがどのように機能するかについての完全な答えは、Remove a child with a specific attribute, in SimpleXML for PHPの詳細をお読みください)。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

$xmlDoc = <<< XML 
<?xml version="1.0" encoding="UTF-8"?> 
<channel> 
<item> 
    <gid>1240</gid> 
</item> 
<item> 
    <gid>1440</gid> 
</item> 
<item> 
    <gid>1440</gid> 
</item> 
<item> 
    <gid>246</gid> 
</item> 
</channel> 
XML; 

$xml = simplexml_load_string($xmlDoc); 
$allgids = []; 
$items = $xml->xpath("//item"); 
foreach ($items as $item) { 

    // find the <gid> 
    $newgid = $item->gid; 
    // manipulate <gid> 
    $item->gid = $newgid +1; 
    if (in_array($newgid, $allgids)) { 
     unset($item[0]); 
    } 
    else { 
     // store all gid + 1 in array 
     $allgids[] = (string)$newgid; 
    } 
} 

echo $xml->asXML(); 

この例では文字列のコードを使用していますが、ファイルから読み込む場合も同じです。

+0

これは非常にうまく動作し、私にとって大きな助けになります。 –

+0

助けになるのはうれしいです。あなたはこの答えに満足すれば正しいものとしてマークすることができますか?ありがとう –

関連する問題