2010-05-07 6 views
0

j'ai une chaîne sérialisée comming avec POST:Trier noeuds XML avec PHP

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

Dans cet exemple, 001 est réorganisés après 003 Comment puis-je mettre à jour mon fichier XML avec ce nouvel ordre? Je pense que j'ai besoin de simpleXML ou de xpath. Voici mes pensées:

// 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); 

Répondre

3

Changer l'ordre des nœuds revient à la transformation de XML. Vous pouvez faire quelque chose comme ceci,

<?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); 
+0

xlst? J'espérais quelque chose de différent? Peut-être que SimpleDOM <\a> ou avec des tableaux et usort peut-être? – FFish

2

XSLT est un bon moyen mais vous pouvez utiliser XPath + array. Première étape - sélectionnez les clés (attributs ou toute autre chose), placez-les dans un tableau, puis triez-les avec les méthodes PHP standard. Deuxième étape - utilisez le tableau comme une carte clé pour créer un nouveau fichier XML.