2016-06-14 135 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