【问题标题】:PHP - Delete XML ElementPHP - 删除 XML 元素
【发布时间】:2009-07-20 13:49:41
【问题描述】:

我需要使用 PHP 删除 XML 文件的元素。它将通过 ajax 完成,我需要通过属性找到 XML 元素。

这是我的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<messages>
    <message time="1248083538">
        <name>Ben</name>
        <email>Ben's Email</email>
        <msg>Bens message</msg>
    </message>
    <message time="1248083838">
        <name>John Smith</name>
        <email>john@smith.com</email>
        <msg>Can you do this for me?</msg>
    </message>
</messages>

所以我想说的是删除时间等于 1248083838 的元素。

到目前为止,我一直在使用 Simple XML,我刚刚意识到它可以做除了删除元素之外的所有事情。

那我该怎么做呢?

【问题讨论】:

    标签: php xml


    【解决方案1】:

    Dave Morgan 是正确的,因为 DOM 类更强大,但如果您想坚持使用 SimpleXML,请尝试在任何节点上使用 unset() 函数,该节点将从 XML 中删除。

    unset($simpleXMLDoc->node1->child1)
    

    【讨论】:

    • 我没有尝试过这样做,但逻辑表明它应该可以正常工作。听起来像是一个快速的肮脏,但对我来说是正确的工作。
    • 对我来说听起来并不快-n-脏。听起来像普通的编码。
    【解决方案2】:

    您可以在 PHP 中使用 DOM 类。 (http://us3.php.net/manual/en/intro.dom.php)。

    您需要将 XML 文档读入内存,使用 DOM 类进行操作,然后您可以根据需要将 XML 保存到 http 或文件中。

    DOMNode 是其中具有删除功能的对象(以解决您的问题)。

    它比 SimpleXML 稍微复杂一点,但是一旦你习惯了它,它就会强大得多

    (半摘自 php.net 上的代码示例)

    <?php
    
    $doc = new DOMDocument; 
    $doc->load('theFile.xml');
    
    $thedocument = $doc->documentElement;
    
    //this gives you a list of the messages
    $list = $thedocument->getElementsByTagName('message');
    
    //figure out which ones you want -- assign it to a variable (ie: $nodeToRemove )
    $nodeToRemove = null;
    foreach ($list as $domElement){
      $attrValue = $domElement->getAttribute('time');
      if ($attrValue == 'VALUEYOUCAREABOUT') {
        $nodeToRemove = $domElement; //will only remember last one- but this is just an example :)
      }
    }
    
    //Now remove it.
    if ($nodeToRemove != null)
    $thedocument->removeChild($nodeToRemove);
    
    echo $doc->saveXML(); 
    ?>
    

    这应该让您对如何删除元素有所了解。它将打印出没有该节点的 XML。如果您想将其发送到文件,只需将字符串写入文件即可。

    【讨论】:

    • 我没有机会检查轻微的语法错误——但这应该会给你一些你需要的东西。我建议不要在 forloop 本身中删除孩子,因为它会与 foreach 的内部计数器混淆。
    【解决方案3】:

    尽管 SimpleXML 没有删除元素的详细方法,但您可以使用 PHP 的 unset() 从 SimpleXML 中删除元素。做到这一点的关键是设法定位所需的元素。至少一种进行定位的方法是使用元素的顺序。先找出要移除的元素的序号(例如使用循环),然后移除该元素:

    $target = false;
    $i = 0;
    foreach ($xml->message as $m) {
      if ($m['time']=='1248083838') { $target = $i; break; }
      $i++;
    }
    if ($target !== false) {
      unset($xml->message[$target]);
    }
    

    您甚至可以通过将目标项目的订单号存储在数组中来删除多个元素。请记住以相反的顺序进行移除 (array_reverse($targets)),因为移除一个项目自然会减少其后项目的订单号。

    诚然,这有点小题大做,但似乎工作正常。

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多