Удалить определенные элементы из XML с помощью PHP

1

Первоначально я хочу разбить 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 ответ

1
Лучший ответ

Сделать цикл в обратном порядке

for($c = count($doc->event); $c >= 0 ; $c--)
{
  if ($doc->event[$c]->typ == 'old') {
    unset($doc->event[$c]);
  }
}
  • 0
    Спасибо большое, такой простой и хороший!
  • 0
    Добро пожаловать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню