2014-02-05 3 views
0

Я чувствую, что мой вопрос будет очень простым, но я пробовал его по-разному, и никто из них, похоже, не работает, я не знаю, куда еще обратиться.Удаление строки XML с использованием PHP

Что я хочу достичь: Я хочу удалить один элемент из файла XML.

Ситуация: У меня есть XML-файл, который действительно просто построен. Это будет более сложной в будущем, но сейчас это выглядит следующим образом:

XML

<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 
</list> 

Этот список отображается на HTML-странице. Теперь, когда они сгенерированы на странице, им присваивается число, начиная с 0, подсчитывая. Итак, первый ингредиент имеет номер 0, а второй - номер 1 и т. Д. У них есть onclick, который отправляет меня в jQuery, удерживая это число. Это я протестировал и отлично работает.

Теперь вот где все пошло не так. Я пробовал $ .ajax(), jQuery jQuery javascript в $ .post() и даже создавал прямые элементы HTML-элементов с сообщением. Ни один из них, похоже, не работает, даже если я скопирую пример непосредственно из другого места.

Мой PhP файл для удаления элементов выглядит следующим образом:

PHP

<?php 
header('Location:index.php'); 
$xmldoc = new DOMDocument(); 
$xmldoc->load('ingredients.xml'); 

$root = $xmldoc->firstChild; //Take the <list> tag 

$toDel = $_POST['itemToDel']; // This is the number received of the relevant item 

$root->removeChild(item($toDel)); 

$xmldoc->save('ingredients.xml'); 
?> 

Кто-нибудь есть идея для меня? Когда я тестировал с проверенным рабочим кодом PHP, он тоже не реализовывал, поэтому у меня есть ощущение где-то между PHP и Javascript, оно не доставляет. В настоящее время, так как я удалил мои предыдущие попытки, это мой Javascript прямо сейчас:

function removeItem(item){ 

var itemToDel = item; // The number of the item to delete. 
var removeItem = $('.ingredient')[itemToDel].remove(); // removing the HTML parts 

//Remove the matching XML line 
} 

последней минуту редактирование: Я могу написать в моем файле XML (разрешения в порядке), и я использовал другие PHP скрипты, работает, поэтому localhost действительно поддерживает его.

ответ

0

Используйте Xpath, чтобы выбрать узлы, которые вы хотите удалить, и удалить их из соответствующего родительского узла. DOMXpath :: evaluation() позволяет использовать выражения Xpath для извлечения списка узлов или скалярного значения. В этом случае вам нужен список с одним или без узла элемента.

Выберите элемент документа "список" ...

/list

... в "ингредиент" элементы внутри него ...

/list/ingredient

... сводится к один элемент по своей позиции ...

/list/ingredient[3]

Пример Источник:

$xml = <<<'XML' 
<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 
    <ingredient>Third item</ingredient> 
    <ingredient>Fourth item</ingredient> 
</list> 
XML; 

$xmldoc = new DOMDocument(); 
$xmldoc->loadXml($xml); 
$xpath = new DOMXpath($xmldoc); 

$toDel = 3; 
$expression = '/list/ingredient['.((int)$toDel).']'; 

foreach ($xpath->evaluate($expression) as $node) { 
    $node->parentNode->removeChild($node); 
} 

echo $xmldoc->saveXml(); 

Выход:

<?xml version="1.0"?> 
<list> 
    <ingredient>First item</ingredient> 
    <ingredient>Second item</ingredient> 

    <ingredient>Fourth item</ingredient> 
</list> 
+0

Спасибо за ответ THW, но я хотел бы спросить, немного больше. В вашем примере вы выражаете $ toDel как 3, и, как вы знаете, это число является переменной. Проблема для меня заключается в получении этого числа в PHP с HTML-страницы. Я могу определить его на моей HTML-странице, и я могу получить его в javascript, но переход на PHP, похоже, не идет. – Mortaza

+0

Пример самодостаточен, поэтому его можно выполнять без внешних зависимостей (файл, пользовательский ввод). Вы должны адаптировать его и использовать '$ toDel = $ _POST ['itemToDel'];' снова. – ThW

+0

Это ответ на мой вопрос :) Оказалось, что я сделал успешный вызов для моего PHP-файла, но с предлагаемым PHP для его удаления он фактически удалил его. Последний вопрос: почему вы используете функцию оценки() в бит foreach? Разве это уже не правильно с использованием «. ((Int) $ toDel)». или я недопонимаю оценку()? – Mortaza

Смежные вопросы