Intereting Posts
PHP: Как отправить исходный пароль пользователю, когда он нажимает забыли пароль, который зашифрован с помощью md5? Как запустить Django и PHP на одном сервере Apache? Как добавить настраиваемое исключение в symfony2 Захват и управление данными электронной почты с помощью PHP Как мне создать кнопку выхода из системы в моей строке меню, которая отображается помощником вида? Преобразование postgresql hstore в php-массив PHP-пользовательский класс (логин / выход / регистрация) Laravel: Как мне вернуть маршрут маршрута с завершающими косыми чертами? Запрос Mysql в Mysqli и Подготовить заявление Добавление проверки, чтобы проверить, не выбран ли переключатель Передача массивов в качестве параметра url Cookies PHP Session не работают, когда пользователи меняют IP-адрес Переопределение функции PHP? Добавление индекса массива PHP – разные уровни Как разрешить cURL Error (7): не удалось подключиться к хосту?

Сортировка узлов XML с помощью PHP

У меня есть сериализованная строка, входящая в состав POST:

$imgdata = $_POST['imgdata']; // li[]=2&li[]=3&li[]=1&li[]=4 

В этом примере 001 переупорядочивается после 003. Как я могу обновить свой XML-файл с помощью этого нового порядка? Я думаю, мне нужен simpleXML или xpath. Вот мои мысли:

 // 1. load xml string $xml = simplexml_load_file('test.xml'); /* <?xml version="1.0" encoding="UTF-8"?> <gallery> <album> <img src="001.jpg" caption="First caption" /> <img src="002.jpg" caption="Second caption" /> <img src="003.jpg" caption="3th caption" /> <img src="004.jpg" caption="4th caption" /> </album> </gallery> */ // 2. sort nodes // $new_xml_string = "......"; // 3. write out new XML file $handle = fopen("images.xml", 'w'); fwrite($handle, $new_xml_string); fclose($handle); 

Изменение порядка узлов сводится к преобразованию XML. Вы можете сделать что-то подобное,

 <?php $temp = <<<EOT <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"> <xsl:sort select="@src"/> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet> EOT; $xml = new DOMDocument; $xml->loadXML($oldXml); $xsl = new DOMDocument; $xsl->loadXML($temp); $proc = new XSLTProcessor; $proc->importStyleSheet($xsl); // attach the xsl rules $newXml = $proc->transformToXML($xml); ? <?php $temp = <<<EOT <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"> <xsl:sort select="@src"/> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet> EOT; $xml = new DOMDocument; $xml->loadXML($oldXml); $xsl = new DOMDocument; $xsl->loadXML($temp); $proc = new XSLTProcessor; $proc->importStyleSheet($xsl); // attach the xsl rules $newXml = $proc->transformToXML($xml); 

XSLT – это правильный путь, но вы можете использовать массив XPath +. Первый шаг – выбрать ключи (атрибуты или что-то еще), поместить их в массив, а затем отсортировать по стандартным методам PHP. Второй шаг – использовать массив в качестве ключевой карты для создания нового XML.