2012-04-11 28 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