用php删除xml属性 - 异常xml

时间:2012-04-11 20:02:22

标签: php xml

我创建了一个解析xml文档的ios应用程序。如果用户登录,他们的信息将被添加到xml文件中。我希望能够在用户注销或取消登录时删除用户。基本上,我需要弄清楚如何删除xml对象(在本例中为用户),如下所示:

<users>
    <user>
        <fname>fname1</fname>
        <lname>lname1</lname>
    </user>
    <user>
        <fname>fname2</fname>
        <lname>lname2</lname>
    </user>
</users>

例如,我可能想要删除一个基于姓氏的用户,在我的情况下它总是唯一的...这是我到目前为止的PHP,但我完全愿意接受这样做的建议不同的方式

$deletefname = $row['fname'];
$deletelname = $row['lname'];
$deleteimageurl = $row['imageURL'];

$xmlUrl = "thefile.xml"; // XML 
$xmlStr = file_get_contents($xmlUrl);
$xml = new SimpleXMLElement($xmlStr);
foreach($xml->users as $user)
{
    if($user[$fname] == $deletefname) {
        $xml=dom_import_simplexml($user);
        $xml->parentNode->removeChild($xml);    
    }
}


$xml->asXML('newfile.xml');
echo $xml;

我使用php非常糟糕,我从其他人处获取此代码。不是100%确定它是如何工作的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

<?php 
/*
 * @source_file -- source to your xml document
 * @node_to_remove -- your node
 * Note this will remove an entire user from the source file if the argument (node_to_remove)
   matches a nodes node value
 *
 */
function newFunction($source_file,$node_to_remove) {
    $xml = new DOMDocument();
    $xml->load($source_file);
    $xml->preserveWhiteSpace = false;
    $xml->formatOutput = true; 
    foreach ($xml->getElementsByTagName('users') as $users ) 
    {
        foreach($users->getElementsByTagName('user') as $user) {

            $first_name = $user->getElementsByTagName('fname')->item(0);

            if($first_name->nodeValue == $node_to_remove) {


                $users->removeChild($users->getElementsByTagName('user')->item(0));

            }

        }

    }

    $result = $xml->saveXML();

    return $result;

}


echo newFunction('xml.xml','lname1');
?>

答案 1 :(得分:1)

在开始之前,我会发出通常的警告,即XML文件不是数据库,您应该使用真实数据库(mysql,sqlite,xml数据库)或至少文件锁定(flock())或原子写入(写入临时文件,然后写入rename()到真实姓名)。如果不这样做,您将遇到一个请求正在读取文件的情况,因为另一个请求正在编写它并获取垃圾XML。

您可以使用SimpleXMLDOMDocument执行此操作,使用其中任何一个都可以使用xpath或迭代。

以下是SimpleXMLElement方法,因为这是您的代码使用的方法。

$sxe = simplexml_load_string($xmlstring);
// XPATH
$matches = $sxe->xpath('/users/user[lname="lname2"]');
foreach ($matches as $match) {
    unset($match[0]);
}
// Iteration--slower, but safer if a part of the path is dynamic (e.g. "lname2")
// because xpath literals are very hard to escape.
// be sure to iterate backwards
for ($i=$sxe->user->count()-1; $i >= 0; --$i) {
    if ($sxe->user[$i]->lname=='lname2') {
        unset($sxe->user[$i]);
    }
}

echo $sxe->asXML();