如何使用php从xml文件中删除节点并将其存储在另一个xml文件中?

时间:2013-12-27 05:50:03

标签: php xml dom

我有一个像这样的xml文件,它有一些警报 alert.xml

<?xml version="1.0"?>
<alerts>
  <alert>
    <id>3</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
    <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>
  <alert>
    <id>6</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
    <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>
  <alert>
    <id>14</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
   <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>
  <alert>
    <id>24</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
    <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>
</alerts>

现在我正在使用这样的PHP来读取此文件以查找记录。

$alerts = new simpleXMLElement($filename, null, true);
$search_mediums1 = $alerts->xpath('alert[msg_type=1]');

$search_mediums = array_reverse($search_mediums1);
foreach ($search_mediums as $arr_alert) {
    if ($arr_alert->id == $my_id) {
        // i want some code here to delete that node
        // and put it into some other xml with same structure file
        break;
    }
}

我找到了一些DOMDocument();课程的解决方案,但我在这里使用simpleXMLElement
它正常工作以查找所需的msg_type=1id=$my_id记录,现在我想从alert.xml文件中删除该节点,如果找到并将其放入具有相同格式的other xml file中为alert.xml。如何从“alert.xml”中删除节点并将其放入另一个xml文件中?

2 个答案:

答案 0 :(得分:2)

根据PHP DocSimpleXMLElement没有removeChild()方法或类似方法,因此您可能会更好地使用DOMDocument

将此代码更改为DOM非常简单,虽然DOM代码看起来有点冗长且冗长......

$dom=new DOMDocument();
$dom->loadXML(/* XML content */);
$xpath=new DOMXPath($dom);
$nodeList=$xpath->query('alert[msg_type=1]');
$myID=14; // Just to demonstrate
foreach($nodeList as $node)
{
    foreach($node->childNodes as $child)
    {
        if($child->nodeName=="id")
        {
            if($child->textContent==$myID)
            {
                $node->parentNode->removeChild($node);
            }
            break;
        }
    }
}
echo $dom->saveXML();

Online demo

输出:

<?xml version="1.0"?>
<alerts>
  <alert>
    <id>3</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
    <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>
  <alert>
    <id>6</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
    <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>

  <alert>
    <id>24</id>
    <msg_type>1</msg_type>
    <msg>Some Message</msg>
    <url>Some Link</url>
    <status>0</status>
    <create_date>1388049941</create_date>
    <update_date>1388052529</update_date>
  </alert>
</alerts>

您可以看到<alert>已移除<id>14</id>


其他:

要将已删除的节点移动到另一个文档,请执行以下操作:

$target=new DOMDocument();
$target->loadXML(/* xml */);
/* ... */
if($child->textContent==$myID)
{
    $target->documentElement->appendChild($target->importNode($node,true));
    $node->parentNode->removeChild($node);
}
/* ... */

Online demo

答案 1 :(得分:1)

我已经解决了一个使用dom_import_simplexml方法删除所需节点的问题,如下所示

$alerts = new simpleXMLElement($filename, null, true);
$search_mediums1 = $alerts->xpath('alert[msg_type=1]');

$search_mediums = array_reverse($search_mediums1);
foreach($search_mediums as $arr_alert)
{
    if($arr_alert->id==$my_id)
    {
       // Deleting the Node 
        $domRef = dom_import_simplexml($arr_alert);
        $domRef->parentNode->removeChild($domRef);
        $dom = new DOMDocument('1.0');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        $dom->loadXML($alerts->asXML());
        $dom->save($filename);


       // moving the Node into another file
        $target=new DOMDocument();
        $target->formatOutput = true;
        $target->preserveWhiteSpace = false;
        $target_content = file_get_contents($target_filename);
        $target->loadXML($target_content);
        $target->documentElement->appendChild($target->importNode($domRef,true));
        $target->save($target_filename);
        break;
    }
}