2013-04-22 81 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