2015-09-04 112 views
1

最初我想將XML文件分成兩個文件。所以我必須刪除一些元素。使用PHP從XML中刪除某些元素

XML看起來是這樣的:

<?xml version="1.0"?> 
<events> 
    <event> 
    <id>1</id> 
    <typ>new</typ> 
    </event> 
    <event> 
    <id>2</id> 
    <typ>new</typ> 
    </event> 
    <event> 
    <id>3</id> 
    <typ>old</typ> 
    </event> 
    <event> 
    <id>4</id> 
    <typ>new</typ> 
    </event> 
    <event> 
    <id>5</id> 
    <typ>old</typ> 
    </event> 
    <event> 
    <id>6</id> 
    <typ>old</typ> 
    </event> 
    <event> 
    <id>7</id> 
    <typ>old</typ> 
    </event> 
</events> 

我需要的是:

<?xml version="1.0"?> 
<events> 
    <event> 
    <id>1</id> 
    <typ>new</typ> 
    </event> 
    <event> 
    <id>2</id> 
    <typ>new</typ> 
    </event> 
    <event> 
    <id>4</id> 
    <typ>new</typ> 
    </event> 
</events> 

所以我必須刪除所有事件與typ = old。我試過這樣:

$events = file_get_contents("events.xml"); 
$doc = new SimpleXMLElement($events); 
foreach($doc->event as $seg) 
{ 
    if ($seg->typ == 'new') { 
    echo "$seg->typ<br />"; 
    unset($doc->event[$seg]); 
    } 
} 
echo $doc->asXml(); 

但只有回聲是正確的,其餘的仍然是一樣的。 後來我發現這個功能:

function delete_event_typ($typ, $filename = 'events.xml'){ 
    $data = simplexml_load_file($filename); 
    for($i = 0, $length = count($data->event); $i < $length; $i++){ 
    if($data->event[$i]->typ == $typ){ 
     unset($data->event[$i]); 
    } 
    } 
    file_put_contents($filename, $data->saveXML()); 
} 
//SAMPLE USAGE 
delete_event_typ('old'); 

但不刪除所有條目,它看起來像:

<?xml version="1.0"?> 
<events> 
    <event> 
    <id>1</id> 
    <typ>new</typ> 
    </event> 
    <event> 
    <id>2</id> 
    <typ>new</typ> 
    </event> 

    <event> 
    <id>4</id> 
    <typ>new</typ> 
    </event> 

    <event> 
    <id>6</id> 
    <typ>old</typ> 
    </event> 

</events> 

所以我還能怎麼辦?有任何想法嗎?

回答

1

製作環路以相反的順序

for($c = count($doc->event); $c >= 0 ; $c--) 
{ 
    if ($doc->event[$c]->typ == 'old') { 
    unset($doc->event[$c]); 
    } 
} 
+0

非常感謝你,這樣的簡單和好! – Bazi

+0

歡迎您! – splash58