2016-06-14 4 views
0

Я пытаюсь удалить узел XML с помощью PHP (SimpleXML).Удалить узел XML с SimpleXML, PHP

Это мой XML:

<?xml version="1.0"?> 
<items> 
    <a> 
     <name>A1</name> 
     <b> 
      <title>Item1</title> 
      <url>item1</url> 
     </b> 
     <b> 
      <title>Item2</title> 
      <url>item2</url> 
     </b> 
     <b> 
      <title>Item3</title> 
      <url>item3</url> 
     </b> 
    </a> 
    <a> 
     <name>A2</name> 
     <b> 
      <title>Item1</title> 
      <url>item1</url> 
     </b> 
    </a> 
</items>  

и это мой PHP код:

<?php 
    $xml = simplexml_load_file($_GET["xml"]); 
    $sxe = new SimpleXMLElement($xml->asXML()); 


    $ID = $_GET["ID"]; 
    $i = -1; 
    $num = $_GET["num"]; 

    foreach ($sxe->children() as $var) { 
     if ($var == $ID) { 
      foreach ($var->children() as $data) { 
       if ($data == "link") { 
        $i++; 

        if ($i == $num) { 
         if (! empty($sxe)) { 
          unset($sxe[0]); 
         } 
        } 
       } 
      } 
     } 
    } 

    $sxe->asXML($_GET["xml"]); 
?> 

Этот код ищет с данными $ ID (например, $ ID = "A1") , Узел, который он хочет удалить, - это узел (с его и), который является узлом # $ num.

Пример: если $ ID = "A1" и $ num = 1, , ему необходимо удалить узел с заголовком "Item2" и url "item2".

Что я делаю неправильно?

Спасибо!

ответ

0

Используйте xpath для поиска узла. С вашим примером будет

//a[name="A1"]/b[2] 

и использовать DomDocument метод removeChild изменить XML

$sxe = simplexml_load_string($xml); 
$node = $sxe->xpath('//a[name="'. $ID .'"]/b['. $num .']'); 
$dom=dom_import_simplexml($node[0]); 
$dom->parentNode->removeChild($dom); 
echo $sxe->asXML(); 
+0

ли $ Обл файл XML? (file.xml) или загрузить его в $ str? ($ xml = simplexml_load_file ($ _ GET ["xml"]); $ str = new SimpleXMLElement ($ xml-> asXML());) –

+0

Предупреждение: simplexml_load_string(): Entity: строка 1: ошибка парсера: ожидается начальный тег , '<' не найден в deletenode.php на линии 72 Предупреждение: simplexml_load_string(): links.xml в deletenode.php на линии 72 Предупреждение: simplexml_load_string():^в deletenode.php на линии 72 Fatal error: вызов функции-члена xpath() для не-объекта в deletenode.php в строке 73 (72 is $ sxe = simplexml_load_string ($ xml);) –

+0

Вы можете сохранить свой код: '$ xml = simplexml_load_file ($ _GET [ "XML"]); $ sxe = new SimpleXMLElement ($ xml-> asXML()); ' – splash58