Я создал скрипт PHP, который создает таблицу из XML-документа через AJAX. Например:
<bookstore>
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
Создает таблицу со столбцами заголовка, автора, года и цены плюс дополнительный столбец удаления. При синтаксическом анализе XML я установил значение tr id равным текущему элементу XML (0 и 1) в приведенном выше случае.
Когда я нажимаю удалить, я запускаю AJAX-запрос с идентификатором строки, которую я хочу удалить. Сценарий удаления получает текущий номер строки без проблем, но у меня возникают странные результаты при попытке удалить его. Текущий код, который я пытаюсь найти ниже (взят из http://quest4knowledge.wordpress.com/2010/09/04/php-xml-create-add-edit-modify-using-dom-simplexml-xpath/ 7.2)
if (isset($_POST['rowNumber'])) {
$rowNumber = $_POST['rowNumber'];
$file = $_POST['file'];
$dom = new DOMDocument();
$dom->load("../XML/".$file);
$xml = $dom->documentElement;
//PROBLEM HERE
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item($rowNumber));
$handle = fopen("../XML/".$file, 'w');
fwrite($handle, $dom->saveXML());
}
Я строю таблицу при загрузке страницы, а затем при каждом удалении. Проблема в том, что удаляются неправильные строки, и я не могу понять, почему.
ДОПОЛНИТЕЛЬНЫЕ ИСПЫТАНИЯ ...
Удаляет первый узел при 50% кликов:
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item(0));
Всегда удаляет первый узел:
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item(1));
Удаляет второй узел на 50% кликов:
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item(2));
Всегда удаляет второй узел:
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item(3));
Удаляет третий узел при 50% кликов:
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item(4));
Всегда удаляет третий узел:
$xml->childNodes->item(0)->parentNode->removeChild($xml->childNodes->item(5));
ДОБАВЛЕНО МОЙ AJAX-КОД
$('#generatedTable a.delete').live('click', function (e) {
e.preventDefault();
//TABLE ROW ID TO BE DELETED. CAN ALERT THIS FINE.
var trID = $(this).closest('tr').attr('id');
$.ajax({
url: "functions/xmlDelete.php",
type: "POST",
dataType: "json",
data: "rowNumber="+ trID + "&fileName=" + fileName,
success: function(data) {
$.ajax({
url: "functions/xmlParser.php",
type: "POST",
dataType: "json",
data: "fileName="+ fileName,
success: function(data) {
$('#xmlTable').html(data.table);
$('#xmlTable').fadeIn('fast');
oTable = $('#generatedTable').dataTable({
"bJQueryUI": true,
"bPaginate": false,
"bLengthChange": false,
"bFilter": false,
"bSort": false,
"bInfo": true
});
}
});
}
});
} );
Вот так выглядят строки моей таблицы, и я могу без проблем предупредить trID.
<tr id="0" class="odd">
<td id="0">1999 Grammy Nominees</td>
<td id="1">Many</td>
<td id="2">USA</td>
<td id="3">Grammy</td>
<td id="4">10.20</td>
<td id="5">1999</td>
<td align="center"><a class="edit" href="">Edit</a></td>
<td align="center"><a class="delete" href="">Delete</a></td>
</tr>
Может кто-нибудь помочь объяснить, что я вижу здесь. Спасибо!