Имеется XML вида: Code: <?xml version="1.0" encoding="UTF-8" ?> <xml> <item> <title>Item1</title> <text>Text of Item1</text> </item> <item> <title>Item2</title> <text>Text of Item2</text> </item> <item> <title>Item3</title> <text>Text of Item3</text> </item> </xml> Для добавления записей использую SimpleXML (через addChild). Все замечательно, но он пишет новый item в конец. Подскажите плз, как сделать, что бы новый добавленный item был первым, т.е. записывался в начало документа? Я так понимаю это возможно средствами DOM? Подскажите, как это проще реализовать?
Так попробуйте PHP: <?php $sxml = simplexml_load_file ('92.xml'); $xml_str = $sxml->asXML (); $dom = new DOMDocument; //$dom->formatOutput = true; $dom->loadXML ($xml_str); $xpath = new DOMXPath ($dom); $parent = $xpath->query ('//xml'); $next = $xpath->query ('//xml/item'); $new_item = $dom->createElement ('item'); $new_title = $dom->createElement ('title', 'Item0'); $new_text = $dom->createElement ('text', 'Text of Item0'); $new_item->appendChild ($new_title); $new_item->appendChild ($new_text); $parent->item(0)->insertBefore ($new_item, $next->item (0)); echo $dom->saveXML (); ?>
Какая у вас версия PHP? Попробуйте такой вариант (без XPath) PHP: <?php $sxml = simplexml_load_file ('92.xml'); $xml_str = $sxml->asXML (); $dom = new DOMDocument; //$dom->formatOutput = true; $dom->loadXML ($xml_str); $parent = $dom->documentElement; $first_item = $parent->getElementsByTagname('item')->item (0); $new_item = $dom->createElement ('item'); $new_title = $dom->createElement ('title', 'Item0'); $new_text = $dom->createElement ('text', 'Text of Item0'); $new_item->appendChild ($new_title); $new_item->appendChild ($new_text); $parent->insertBefore ($new_item, $first_item); echo $dom->saveXML (); ?> У меня оба варианта работают (5.2.9). Вывод: Code: <?xml version="1.0" encoding="UTF-8"?> <xml> <item><title>Item0</title><text>Text of Item0</text></item><item> <title>Item1</title> <text>Text of Item1</text> </item> <item> <title>Item2</title> <text>Text of Item2</text> </item> <item> <title>Item3</title> <text>Text of Item3</text> </item> </xml>
Вернулся к старому делу... Версия пхп - 5.2.11. Со вторым вариантом вообще ничего не происходит. При добавлении стандартными средствами ХМЛ все нормально. С ДОМом никак не могу разобраться... Code: //Загружаем XML-файл $xml = simplexml_load_file('news.xml'); //Добавляем данные в XML $item = $xml->channel->addChild('item'); $item->addChild('date', $pubDate); $item->addChild('title', $subject); $item->addChild('description', $content); //сохраняем файл $xml->asXML('news.xml');
Все, разобрался... PHP: <?php $dom = new DomDocument(); $dom->load("news.xml"); $xpath = new DOMXPath ($dom); $parent = $xpath->query ('//xml'); $next = $xpath->query ('//xml/item'); $new_item = $dom->createElement ('item'); $new_title = $dom->createElement ('title', 'Item0'); $new_text = $dom->createElement ('description', 'Text of Item0'); $new_item->appendChild ($new_title); $new_item->appendChild ($new_text); $parent->item(0)->insertBefore($new_item, $next->item(0)); $dom->save("news.xml"); ?>
Еще такой вопрос... Можно ли добавить форматирование в сам ХМЛ-файл, что б новые записи не добавлялись все в одну строку?
Dipp, думать мы все умеем) Меня интересует, как это проще реализовать через тот же DOM. Или может есть другие способы.