2016-06-14 132 views
0

我想用PHP(SimpleXML)刪除XML節點。用SimpleXML刪除XML節點,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

是str中的XML文件中的$? (file.xml)或者我應該加載它到$ str? ($ xml = simplexml_load_file($ _ GET [「xml」]); $ str = new SimpleXMLElement($ xml-> asXML());) –

+0

Warning:simplexml_load_string():Entity:line 1:parser error:Start tag expected , '<' 不在deletenode.php發現線72 警告:simplexml_load_string():在links.xml上deletenode.php線72 警告:simplexml_load_string():^在deletenode.php上線72 致命錯誤:調用第73行的deletenode.php中的非對象的成員函數xpath()73 (72是$ sxe = simplexml_load_string($ xml);) –

+0

您可以保存代碼:'$ xml = simplexml_load_file( $ _GET [ 「XML」]); $ sxe = new SimpleXMLElement($ xml-> asXML());' – splash58