2012-04-11 4 views
1

Ich habe eine iOS-Anwendung erstellt, die ein XML-Dokument analysiert. Wenn sich ein Benutzer anmeldet, werden seine Informationen der XML-Datei hinzugefügt. Ich möchte in der Lage sein, einen Benutzer zu entfernen, wenn sie sich abmelden oder ihre Logins abbrechen. Im Wesentlichen müssen, ich, herauszufinden, wie ein XML-Objekt löschen (einen Benutzer, in diesem Fall), die wie folgt aussieht:Entfernen von XML-Attributen mit PHP - abnormales XML

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

Zum Beispiel kann ich auf dem Nachnamen eines Benutzers basierend entfernen möchten, die in meinem Fall immer eindeutig sein ... Dies ist die pHP, dass ich so weit, aber ich bin völlig offen für Vorschläge auf eine andere Art und Weise zu tun

$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; 

ich bin sehr schlecht mit pHP, und ich nahm dieser Code von jemand anderem. Nicht 100% sicher, wie es funktioniert.

Danke für Ihre Hilfe.

+0

Warten Sie, welchen Knoten möchten Sie entfernen? –

+0

Ich versuche, einen ganzen Benutzer zu löschen. basierend auf ihrem Vornamen in diesem Fall. – thebiglebowski11

+0

u sagte Nachnamen. welches ist es –

Antwort

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

Worauf bezieht sich Element (0) eigentlich? – thebiglebowski11

+0

Es ist eine Instanz von DOMNode. –

+0

Hat das also deine Frage beantwortet? Ich glaube es getan hat. Wenn ja, kannst du die Antwort akzeptieren? –

1

Bevor ich beginne, werde ich die übliche Warnung geben, dass eine XML-Datei keine Datenbank ist, und Sie sollten eine echte Datenbank (MySQL, SQLite, eine XML-Datenbank) oder zumindest das Sperren von Dateien verwenden (flock()) oder atomare Schreibvorgänge (Schreiben in eine temporäre Datei, dann rename() in den richtigen Namen). Wenn Sie dies nicht tun, werden Sie in Situationen geraten, in denen eine Anfrage die Datei liest, während eine andere sie schreibt und Garbage XML erhält.

Sie können dies mit SimpleXML oder mit DOMDocument tun, und mit beiden können Sie Xpath oder Iteration verwenden.

Unten ist die SimpleXMLElement Methode, weil das ist, was Ihr Code verwendet.

$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

Francis, kennst du irgendwelche guten Ressourcen, die mir zeigen, wie man das XML in eine Datenbank umwandelt? Weißt du, ob das den iOS-Teil viel schwieriger macht? – thebiglebowski11

+0

Sie sagen nicht viel über das gesamte Design, also kann ich nicht auf Schwierigkeiten mit iOS kommentieren. Wenn Sie eine URL-Schnittstelle zwischen Client und Server haben, sollte das Backend, das Sie auf dem Server verwenden, keinen Einfluss auf ein sauberes Design haben. Sie können immer noch denselben XML-Code bereitstellen, indem Sie ihn einfach anders speichern. –

+0

Wenn ein Benutzer versucht, das XML zu lesen, während es geschrieben wird, was passiert? – thebiglebowski11