2016-03-21 4 views
1

Bevor ich beginne, bitte beachten Sie, dass ich ziemlich neu bin.So löschen Sie XML-Knoten über ein HTML-Formular mit PHP

Ich habe einen Kalender, den ich schließlich Benutzer in der Lage sein möchte, Ereignisse, die in einer XML-Datei gespeichert sind, über ein HTML-Formular mit PHP hinzufügen, bearbeiten und löschen. Bisher habe ich es geschafft, dank der Tipps auf dieser Seite hinzuzufügen, aber ich habe Schwierigkeiten mit dem Löschen.

Ich möchte, dass der Benutzer den Namen des Ereignisses eingeben kann, das gelöscht werden soll, damit es gefunden und aus der XML-Datei entfernt werden kann.

Das Problem ist, dass, wenn ich ein Ereignis zum Löschen eingeben, das Formular nur Ereignisse in der umgekehrten Reihenfolge, dass sie eingegeben wurden, scheinbar von der Unterseite der XML-Datei gelöscht. Beispiel: Über das HTML-Formular gebe ich 4 Ereignisse ein. Ereignis 1, Ereignis 2, Ereignis 3, Ereignis 4.

Angenommen, ich möchte Ereignis 2 löschen. Ich benutze das Löschen-Formular, um Ereignis 2 zu löschen, aber Ereignis 4 wird gelöscht. Also versuche ich noch einmal Event 2 zu löschen und diesmal wird Event 3 gelöscht.

Jede Hilfe wird sehr geschätzt!

Vielen Dank.

Das ist, was ich habe:

XML

 <calendar> 

    <event> 
    <name>Event 1</name> 
    <startdate>21-3-2016</startdate> 
    <enddate></enddate> 
    <starttime>14.41</starttime> 
    <endtime></endtime> 
    </event> 

     </calendar> 

HTML

<form action="remove.php" method="post" name="remove" id="calendarEdit"> 
<input class="calendarInput" type="text" name="name" id="name"> 
<input type="submit" name="button" id="button" value="Delete"> 
</form> 

Remove.php

$name = $_POST['name']; 

$xml = new DOMDocument('1.0', 'utf-8'); 
$xml-> load('events.xml') ; 

$xpath = new DOMXPath($xml); 

foreach ($xpath->query("/calendar/event['name']") as $node); 

{ 
    $node->parentNode->removeChild ($node); 
} 

$xml->formatoutput - true; 
$xml->save('events.xml'); 

header('Location: calendar.html'); 
exit(); 
+0

Sie verwenden nie '$ name' in Ihrem Löschcode. Sie führen nur eine Schleife (falsch) über alle Ereignisse und versuchen, sie alle zu entfernen. –

+0

Was soll ich verwenden? – HSwaff

+0

wahrscheinlich etwas mehr wie '/ monatlich/event [text() = '$ name']' für die XPath-Abfrage ... –

Antwort

0

Ihr Code:

foreach ($xpath->query("/monthly/event['name']") as $node); 
{ 
    $node->parentNode->removeChild ($node); 
} 

Sie haben einen Tippfehler, das Semikolon am Ende der foreach Deklaration. Durch auf diese Weise bedeutet, dass Ihr Code folgendermaßen aus:

foreach ($xpath->query("/monthly/event['name']") as $node) 
{ 

} 
$node->parentNode->removeChild ($node); 

Also, Ihr foreach() nichts anderes tun, als die Aktualisierung $node Inhalt. Dann, ->removeChild() entfernen Sie tatsächliche $node (letztes Kind).

Auch Ihre XPath-Abfrage ist falsch. Um <name> Knoten mit ‚Ereignis 1‘ Wert zu suchen, müssen Sie ein Muster wie folgt erstellen:

/calendar/monthly/event/name[text() = "Event 1"] 

Beachten Sie, dass / am Anfang des Musters verwendet wird, um die vollständigen Baum von Wurzelelement zu suchen, so Sie müssen den kompletten Nachfahrenbaum verwenden (ich habe angefangen von basierend auf Ihrem Beispiel).

Wenn Sie eine Suche ignorieren Elementposition möchten, müssen Sie // verwenden.Also, wenn Sie für ‚Ereignis 1‘ gesucht werden sollen, ausgehend von <monthly> Artikeln, Ihr Muster ist:

//monthly/event/name[text() = "Event 1"] 

Last but not least: entfernen „Ereignis 1“ Sie nicht über eine foreach-Schleife benötigen, einfach versuchen, diese:

$nodes = $xpath->query('//monthly/event[name[text() = "Event 1"]]'); 
$nodes->item(0)->parentNode->removeChild($nodes->item(0)); 

event[name[text() = "Event 1"]] der Teil des Musters bedeutet: abrufen <event> Elemente mit <text> Kind mit „Ereignis 1“ -Wert.

+0

Danke - aber ich bin mir nicht sicher, ob ich es verstanden habe. Ich habe den Doppelpunkt am Ende der Foreach-Deklaration entfernt, aber als ich ihn getestet habe, löschte er die XML-Datei vollständig. – HSwaff

+0

@HSwaff bearbeitete Antwort mit zusätzlichen Informationen zur XPath-Syntax. Mein Englisch ist nicht gut, also wenn es nicht klar ist, zögern Sie nicht zu fragen. – fusion3k

+0

Vielen Dank für Ihre Hilfe, fusion3k. In meiner ursprünglichen Frage gab es Verwirrung im Code - "monatlich" hätte "Kalender" sein sollen - Entschuldigung, ich habe das jetzt bearbeitet. Der Baum sollte nur Kalender und Ereignis haben. Ich möchte nicht nach Werten suchen, sonst muss ich jeden Wert in den PHP setzen. Ich möchte, dass der Benutzer den Wert in das HTML-Formular eingibt und dass der PHP es findet. Wenn ich also Ereignis 1 in den PHP-Ordner einfüge, wird es immer nur nach Ereignis 1 suchen und nicht nach dem, wonach der Benutzer suchen möchte. Tut mir leid, wenn das verwirrend ist, aber ich bin neu im Codieren. Wie kann ich nach dem suchen, was der Benutzer eingibt? – HSwaff