2012-12-18 155 views
0

我想從我的xml中刪除<wcccanumber>的父節點,如果它的內容符合某個標準,但它只會刪除一個節點<wcccanumber>。我如何刪除整個父節點?PHP DOM刪除孩子

繼承人我的代碼:

$xml = new SimpleXMLElement('<xml/>'); 

if (file_exists("xml/units/E01.xml")) { 

    $xml = simplexml_load_file("xml/units/E01.xml"); 

    echo "File exists"; 
    echo "</br>"; 

    $wcccanumber = "121202482"; 

    foreach ($xml->call->wcccanumber as $call) { 
     if ($call == $wcccanumber) { 
      $dom = dom_import_simplexml($call); 
      $dom->parentNode->removeChild($dom); 

      $fp = fopen("xml/units/E01.xml","wb"); 
      fwrite($fp,$xml->asXML()); 
      fclose($fp); 
     } 
    } 
} 

這裏是XML:

<xml> 
    <call> 
    <wcccanumber>121202482</wcccanumber> 
    <currentcall>FALL</currentcall> 
    <county>W</county> 
    <id>82</id> 
    <location>234 E MAIN ST</location> 
    <callcreated>12:26:09</callcreated> 
    <station>HBM</station> 
    <units>E01</units> 
    <calltype>M</calltype> 
    <lat>45.5225067888299</lat> 
    <lng>-122.987112718574</lng> 
    <inputtime>12/18/2012 12:27:01 pm</inputtime> 
    </call> 
</xml> 
+0

你想刪除所有的通話的孩子,對吧? – DanMan

+0

是的,我會,然後我會更多的代碼來取代,但我不知道如何刪除它們。 –

+0

我最終要刪除整個節點,包括調用 –

回答

1

迭代通過call$wcccanumber比較$call->wcccanumber。將$call轉換爲dom並將其刪除(parentNode->removeChild)。

foreach ($xml->call as $call) { 
    if ($call->wcccanumber == $wcccanumber) { 
     $dom = dom_import_simplexml($call); 
     $dom->parentNode->removeChild($dom); 
     $fp = fopen("xml/units/E01.xml","wb"); 
     fwrite($fp,$xml->asXML()); 
     fclose($fp); 
    } 
} 

如果有多個刪除是有道理的節省只有一次畢竟缺失已經完成。

$deletionCount = 0; 

foreach ($xml->call as $call) { 
    if ($call->wcccanumber != $wcccanumber) { 
     continue; 
    } 
    $dom = dom_import_simplexml($call); 
    $dom->parentNode->removeChild($dom); 
    $deletionCount++; 
} 

if ($deletionCount) { 
    file_put_contents("xml/units/E01.xml", $xml->asXML()); 
} 
+0

這很有道理。謝謝。我不知道我無法想象我自己... –

+0

有時看不到森林爲它的樹:) –

+0

嗯,實際上,如果有一個或多個刪除,你應該保存*後* foreach',這樣你就可以隨時保存一次所有的變化。 – hakre