我创建了一个解析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%确定它是如何工作的。
感谢您的帮助。
答案 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。
您可以使用SimpleXML
或DOMDocument
执行此操作,使用其中任何一个都可以使用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();