Сортировка узлов XML с помощью PHP - PullRequest
0 голосов
/ 07 мая 2010

У меня есть сериализованная строка, поступающая с 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);

Ответы [ 2 ]

3 голосов
/ 07 мая 2010

Изменение порядка узлов сводится к преобразованию 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);
2 голосов
/ 26 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...