2012-04-11 54 views
1

我创建了一个解析xml文档的ios应用程序。如果用户登录,他们的信息将被添加到xml文件中。我希望能够删除用户,如果他们注销或取消他们的登录。从本质上讲,我需要弄清楚如何删除XML对象(用户,在这种情况下),看起来像这样:使用php删除xml属性 - 异常xml

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

例如,我可能要根据姓氏,删除用户,其总是会在我的情况下,唯一的了。这是我到目前为止的PHP的,但我要建议完全开放的做下去,我很不好用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; 

,我就拿这个代码来自别人。不是100%确定它是如何工作的。

感谢您的帮助。

+0

等待,你试图删除哪个节点? – 2012-04-11 20:04:16

+0

我正在尝试删除整个用户。根据他们的名字在这种情况下。你说的姓氏是 – thebiglebowski11 2012-04-11 20:11:48

+0

。哪一个是 – 2012-04-11 20:19:45

回答

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'); 
?> 
+0

实际上是指物品(0)的实际含义? – thebiglebowski11 2012-04-11 20:35:01

+0

它是DOMNode的一个实例。 – 2012-04-11 20:36:16

+0

那么这是否回答你的问题?我相信它的确如此。如果是这样,你能接受答案吗? – 2012-04-11 22:01:06

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(); 
+0

弗朗西斯,你知道任何好的资源,将告诉我如何将XML转换为数据库?你知道这是否会让iOS部分变得更加困难? – thebiglebowski11 2012-04-11 21:20:14

+0

对于整体设计你不会多说,所以我不能评论iOS的困难。如果您在客户端和服务器之间有一个url接口,那么您在服务器上使用的后端应该不会影响干净的设计。您仍然可以提供相同的XML,只是以不同的方式存储它。 – 2012-04-11 21:39:46

+0

如果用户在写入时正在尝试读取xml,会发生什么情况? – thebiglebowski11 2012-04-11 22:06:19