2013-04-22 54 views
0

我一直在这里寻找和谷歌,并找到各种代码,但没有一个工作。我假设这是因为它们都不符合我的确切情况。我有一个这样的xml结构:通过php删除xml节点和所有孩子

<employees> 
     <employee EmpID=""> 
      <first_name></first_name> 
      <last_name></last_name> 
      <ssnum></ssnum> 
      <status></status> 
      <contact_info> 
        <office_phone></office_phone> 
        <email></email> 
        <cell_phone></cell_phone> 
      </contact_info> 
      <access_info level="user"> 
        <username></username> 
        <password></password> 
      </access_info> 
      <department></department> 
      <date_started></date_started> 
      <years></years> 
      <position></position> 
      <salary></salary> 
      <e_increase></e_increase> 
      <e_raise></e_raise> 
      <photo></photo> 
    </employee> 
</employees> 

我有我想要删除的员工的EmpID存储在名为$ ID的变量中。我想彻底删除该员工。我已经尝试了诸如:

foreach ($doc->getElementsByTagName('employee') as $employee) { 
    if($employee->getAttribute('EmpID') === $ID) { 
     foreach ($employee as $node) { 
    $node->parentNode->removeChild($node); 
    } 
    } 
} 

和其他循环试图让同样的事情,因为在这些职位:PHP XML remove element and all children by nameRemove all children from a XML Node PHP DOM,但我一直没能得到这个能够成功。

任何帮助,将不胜感激,谢谢。

回答

1
$ID = ''; 

$dom = new DOMDocument(); 
$dom->loadXML($xml_string); 

$xpath = new DOMXpath($dom); 
$nodes = $xpath->evaluate('/employees/employee[@EmpID = "' . $ID . '"]'); 
foreach ($nodes as $node) { 
    $node->parentNode->removeChild($node); 
} 
+0

试过了,什么都没有发生...... – sharf 2013-04-22 17:52:05

+0

@sharf:在这里工作的很好。修改的XML应该在'$ dom-> saveXML();'中可用,而不是您的原始变量。 – 2013-04-22 17:53:12

+0

我试着保存它,但更改没有保存。我正在使用$ dom-> save();而不是saveXML。我试图改变它,现在我得到这个错误:可捕获致命错误:传递给DOMDocument :: saveXML()的参数1必须是DOMNode的实例,字符串给定 – sharf 2013-04-22 17:58:02

1

你去:

$xml = '<employees> 
     <employee EmpID="1"> 
      <first_name></first_name> 
      <last_name></last_name> 
      <ssnum></ssnum> 
      <status></status> 
      <contact_info> 
        <office_phone></office_phone> 
        <email></email> 
        <cell_phone></cell_phone> 
      </contact_info> 
      <access_info level="user"> 
        <username></username> 
        <password></password> 
      </access_info> 
      <department></department> 
      <date_started></date_started> 
      <years></years> 
      <position></position> 
      <salary></salary> 
      <e_increase></e_increase> 
      <e_raise></e_raise> 
      <photo></photo> 
    </employee> 
    <employee EmpID="2"> 
      <first_name></first_name> 
      <last_name></last_name> 
      <ssnum></ssnum> 
      <status></status> 
      <contact_info> 
        <office_phone></office_phone> 
        <email></email> 
        <cell_phone></cell_phone> 
      </contact_info> 
      <access_info level="user"> 
        <username></username> 
        <password></password> 
      </access_info> 
      <department></department> 
      <date_started></date_started> 
      <years></years> 
      <position></position> 
      <salary></salary> 
      <e_increase></e_increase> 
      <e_raise></e_raise> 
      <photo></photo> 
    </employee> 
</employees>'; 

$doc = new DOMDocument(); 

$doc->loadXML($xml); 

$selector = new DOMXPath($doc); 
$els = $selector->query('/employees//employee'); 

//or 
//$els = $doc->getElementsByTagName('employee'); 


foreach($els as $el){ 
    if($el->getAttribute('EmpID') == 1){ 
     $el->parentNode->removeChild($el); 
    } 
} 

$xml = $doc->saveXML(); 

echo($xml); 
+0

试了一下,什么也没有发生...... – sharf 2013-04-22 17:52:52

+0

这是一个工作的例子 - 试试,看看你有什么在结束了'$ xml' - 它有没有XML节点的EmpID = 1,也许你有你的'$ ID'参数有错误? – Adidi 2013-04-22 17:54:09

+0

$ ID已关闭。我得到它的工作,谢谢。 – sharf 2013-04-22 18:09:12

1

仰望我的xml我有稍微不同的..试试这个。

foreach ($doc->getElementsByTagName('employee') as $employee) { 
    if($employee->getAttribute('EmpID') === $ID) { 
     $employee->parentNode->removeChild($employee); 
     // $dom->save($xmlFile); 
    } 
} 
+0

试过这个,没有任何反应。 – sharf 2013-04-22 17:54:26

+0

保存文件的时间戳是否更改? – Daniel 2013-04-22 18:06:11

+0

它的工作原理,是我的错误,对不起。 – sharf 2013-04-22 18:08:45