2016-03-21 15 views
1

Başlamadan önce lütfen bunun için oldukça yeniyim.php kullanarak html formuyla xml düğümleri nasıl silinir

Sonunda, kullanıcıların bir XML dosyasında depolanan olayları PHP kullanarak bir HTML biçiminde ekleyebilmelerini, düzenleyebilmelerini ve silebilmelerini istediğim bir takvim var. Şimdiye kadar, bu sitede bulunan ipuçları sayesinde eklemeyi başardım, ancak silme konusunda zorluk yaşıyorum.

Kullanıcının silinmesini istediğiniz olayın adını girmesini istiyorum, böylece xml dosyasından bulunup kaldırılabilir.

Sorun şu ki, silme için bir olay girdiğimde, form, yalnızca xml dosyasının altından görünen, girilenleri yalnızca ters sırada silecektir.

Örneğin: HTML formu aracılığıyla 4 olay giriyorum. Olay 1, Olay 2, Olay 3, Olay 4.

Olay 2'yi silmek istediğimi varsayalım. Olay 2'yi silmek için silme formunu kullanıyorum, ancak Olay 4 silindi. Bu yüzden tekrar Event 2'yi silmeyi deneyin ve bu kez Event 3 silinir.

Herhangi bir yardım çok takdir edilmektedir!

Çok teşekkürler.

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

Silme kodunuzda '$ name' kullanmazsınız. tüm olaylar üzerinde sadece (yanlış) dönersiniz ve hepsini kaldırmaya çalışırsınız. –

+0

Ne kullanmalıyım? – HSwaff

+0

muhtemelen xpath sorgusu için '/ monthly/event [text() = '$ name']' gibi bir şey daha ... –

cevap

0

Kodunuz:

Bu

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

foreach bildiriminin sonunda bir noktalı virgül, noktalı virgül var. Bu arada, kodunuzu bu şu anlama gelir:

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

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

Yani, foreach() $node içerik güncellenmesi başka bir işlev görmemektedir. Sonra, ->removeChild() gerçek $node'u (son çocuk) kaldırın.

Ayrıca, XPath sorgunuz yanlış. 'Olay 1' değeri ile <name> düğümler aramak için, böyle bir model oluşturmak zorunda:

desen başında / kök elemanından başlayarak tam ağacını aramak için kullanılır Not olduğunu
/calendar/monthly/event/name[text() = "Event 1"] 

, bu yüzden Tamamen soy ağacını kullanmalısınız (örneğinize göre calendar'dan başladım).

Arama yoksayma öğesi konumunu gerçekleştirmek istiyorsanız, //'u kullanmanız gerekir.Eğer <monthly> öğeden başlayarak 'Olay 1' için arama istiyorsanız, sizin kalıptır:

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

Son olarak: Bir foreach döngü gerekmez “Etkinlik 1” kaldırmak için, sadece bu deneyin:

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

desen event[name[text() = "Event 1"]] parçası şu anlama gelir: “Olay 1” değerine sahip <text> çocuk sahibi <event> unsurları almak.

+0

Teşekkürler - ama anladığımdan emin değilim. Foreach bildiriminin sonunda iki nokta üst üste çıkarıldım, ancak test ettiğimde xml dosyasını tamamen sildi. – HSwaff

+0

@HSwaff, xpath sözdizimi hakkında ek bilgi içeren yanıtı düzenledi. Ingilizcem iyi değil, bu yüzden eğer açık değilse sormaktan çekinmeyin. – fusion3k

+0

Yardımlarınız için teşekkür ederiz, fusion3k. Orijinal sorudaki kodda kafa karışıklığı vardı - 'aylık' 'takvim' olmalıydı - üzgünüm, şimdi onu düzenledim. Ağaç sadece takvim ve etkinliğe sahip olmalıdır. Değerler aramak istemiyorum, aksi halde her değeri php'ye koymak zorundayım. Kullanıcının html formundaki değeri ve php'yi bulmasını istiyorum. Bu yüzden eğer Event 1'i php'ye koyarsam, sadece Event 1'i arar ve kullanıcının ne aramak istediğini değil. Bu kafa karıştırıcıysa özür dilerim, ancak kodlama konusunda yeniyim. Kullanıcının ne girdiğini nasıl arayabilirim? – HSwaff

İlgili konular