У меня есть сериализованная строка, входящая в состав 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.