Я знаю, как PHP читает, записывает и добавляет… но умеете ли вы вставлять?или удалить последнюю строку?
Вопрос
Я пытаюсь создать файл XML, но файл XML необходимо обернуть узлами...следовательно, приложение не так просто использовать.
Любая помощь в этом была бы здорово!!
Мой XML состоит из двух разных типов узлов:
<entry id="1_0">
<title>This is the title</title>
<description>This is the description...</description>
<subName>Publishers Name</subName>
<date>Saturday, June 11th, 2007, 5:46:21 PM</date>
<BorF>bug</BorF>
</entry>
<vote id="1_0">5</vote>
И у меня есть простая страница тестирования, использующая jQuery для отправки данных (в настоящее время статических) в файл PHP.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script>
$(function(){
$("#addVote").click(function() {
$.ajax({
type: "POST",
url: "saveListData.php",
data: 'url=bugs_features_listdata.xml&listData=\n<vote id="1_2">3</vote>',
async: false,
cache: false,
success: function(data, textStatus) {
if (window.console) console.log(textStatus);
},
complete: function(XMLHttpRequest, textStatus){
if (window.console) console.log(textStatus);
}
});
});
$("#addEntry").click(function() {
$.ajax({
type: "POST",
url: "saveListData.php",
data: 'url=bugs_features_listdata.xml&listData=\n<entry id="1_1">\n\
\t<title>This is the title 1</title>\n\
\t<description>This is the description...</description>\n\
\t<subName>Publishers Name</subName>\n\
\t<date>Saturday, June 11th, 2007, 5:46:21 PM</date>\n\
\t<BorF>bug</BorF>\n\
</entry>',
async: false,
cache: false,
success: function(data, textStatus) {
if (window.console) console.log(textStatus);
},
complete: function(XMLHttpRequest, textStatus){
if (window.console) console.log(textStatus);
}
});
});
});
</script>
</head>
<body>
<a id="addVote" href="#">ADD VOTE</a><br /><br /><a id="addEntry" href="#">ADD ENTRY</a>
</body>
</html>
... который в настоящее время добавляет его в мой XML-файл, но мне нужны начальные/конечные узлы.
Решение
txwinger высказал правильную мысль в своем комментарии к вашему вопросу.Вам следует использовать одну из многих встроенных в PHP библиотек манипуляции XML, чтобы добавить узел, затем сериализовать его и сохранить в виде текстового файла.В ПростоXML, например:
$xml = simplexml_load_file('test.xml');
$vote = $xml->addChild('vote', '5');
$vote->addAttribute('id','1_0');
$fp = fopen('test.xml', 'w');
fwrite($fp, $xml->asXML());
fclose($fp);
Есть другие библиотеки манипуляции XML это может лучше подойти для вашей задачи
Другие советы
Я бы сказал, что это зависит от структуры вашего XML-документа.Если «остальное» предсказуемо, вы можете вырезать эту часть из файла, добавить новые данные и вставить «остальное» обратно:
⋮
n-1: <node>last node</node>
n : </root>
⋮
n-1: <node>last node</node>
n : <node>new node</node>
n+1: </root>
Если вы пытаетесь сделать это быстрым и грязным способом:Если вы откроете файл в «r+» и установите указатель на пустую строку между последним элементом и концом файла, он будет записываться поверх закрывающего тега элемента корневого уровня, поэтому просто добавьте его обратно после записи нового дочернего элемента. элемент.Имейте в виду, что я писал PHP-скрипты все 4 часа, так что, возможно, есть способ получше, но это самый простой способ, который я придумал за свою 4-часовую карьеру.
$name = $_POST["name"];
$phone = $_POST["phone"];
$fh = fopen("xml-test-1.xml", "r+");
if (!$fh)
{
die("Failed to open");
}
fseek($fh, -11, SEEK_END);
fwrite($fh, "<person> \n");
fwrite($fh, "<name>$name</name> \n");
fwrite($fh, "<phone>$phone</phone> \n");
fwrite($fh, "</person> \n");
fwrite($fh, "</people> \n");
fclose($fh);
echo "now look and see if anything was added";