2011-01-12 14 views
0

xmlから子ノードを削除しようとしています。 私のスクリプトは動作していますが、いくつかの子を削除しています...削除したいものだけではありません...xmlファイルの子ノードをPHPで削除する

私の問題は何ですか?

XMLファイル:

<?xml version="1.0" encoding="UTF-8" ?> 
<events> 
    <record> 
     <id>3</id> 
    </record> 
    <record> 
     <id>2</id> 
    </record> 
    <record> 
     <id>1</id> 
    </record> 
</events> 

delete.phpファイル:

<?php 
header("Content-type: text/html; charset=utf-8"); 

$record = array(
    'id' => $_POST['id'], 
); 
$users = new DOMDocument(); 
$users->load("xmp.xml"); 

$suser = simplexml_load_file("xmp.xml"); 
$count = 0; 
$user = $users->getElementsByTagName("record"); 

foreach($user as $value) 
{ 
    $tasks = $value->getElementsByTagName("id"); 
    $task = $tasks->item(0)->nodeValue; 

    if ($task == $record["id"]) { 
    $users->documentElement->removeChild($users->documentElement->childNodes->item($count)); 
    } 
    $count++; 
} 

$users->save("xmp.xml"); 

?> 
+0

理由ですコードでこの行: '$ suserの= simplexml_load_file( "xmp.xml");'? – Gordon

+0

うーん..私は考えていない..それは間違っている.. – Ofear

答えて

3

は、削除するノードを取得します。 removeChild()parentNodeです。追記で

$node->parentNode->removeChild($node); 

XPathを使用しているとき、あなたはより少ないコードでこれを行うことができます。

$id = /* some integer value */ 
$dom = new DOMDocument; 
$dom->load('file.xml'); 
$xpath = new DOMXPath($dom); 
$query = sprintf('/events/record[./id = "%d"]', $id); 
foreach($xpath->query($query) as $record) { 
    $record->parentNode->removeChild($record); 
} 
echo $dom->saveXml(); 

$idに格納された値を持つ<id>子ノードと<record>要素を削除します。

Run code on Codepad

より多くの例:remove element from xml

+1

あなたはより詳細になることができますか?私のスクリプトにこの行をどこに置くべきですか? – Ofear

+0

あなたの 'removeChild'呼び出しの代わりに@Ofearを使用してください。 – Gordon

+1

これは素晴らしいことです!完璧な作品!最初の行に$ id = "some integer number"を追加してください。答えを探す他の人のために?大変ありがとうございました! – Ofear

関連する問題