Ordinamento XML con SimpleXML / XPath?

Ho un po 'di XML, dico:

<Backgrounds> <Background> <Uses>14</Uses> </Background> <Background> <Uses>19</Uses> </Background> <Background> <Uses>3</Uses> </Background> </Backgrounds> 

Come posso ordinare l'XML dagli Uses più bassi al più alto?

Forse un'espressione xpath?

Inoltre, come posso semplicemente recuperare i 2 Background inferiori o quelli aggiunti più di recente?

Esempi di sorting con SimpleXML / XPath

Come posso ordinare l'XML dagli Uses più bassi al più alto?

Per ordinare un elenco di elementi dal più basso al più alto, è necessario creare un arrays di questi elementi e quindi ordinare quell'arrays. L'espressione xpath può essere utilizzata per get sia l'arrays di elementi da ordinare sia i dati su cui è ordinato l'arrays (chiave di sorting).

Con il tuo XML e i bambini Uses come valore di sorting, funziona come il seguente:

 $elements = $xml->xpath('/*/Background'); $sortKeys = $xml->xpath('/*/Background/Uses'); arrays_multisort($sortKeys, SORT_NUMERIC, SORT_ASC, $elements); foreach($elements as $i => $element) { echo $i, ' ', $element->asXML(), "\n"; } 

Quale risulta in:

 0 <Background> <Uses>14</Uses> </Background> 1 <Background> <Uses>19</Uses> </Background> 2 <Background> <Uses>3</Uses> </Background> 

Vedere arrays_multisort() e "Come ordinare un arrays multidimensionale in php" .


Inoltre, come posso semplicemente recuperare i 2 Background inferiori o quelli aggiunti più di recente?

Questo è ansible fare con xpath da solo:

 $bottomTwo = $xml->xpath('/*/Background[position() > count(/*/Background) - 2]'); 

E se aggiunti di recente indicano quelli in alto e non in basso:

 $topTwo = $xml->xpath('/*/Background[position() < 3]'); 

Possibile soluzione:

  • Analizzare l'XML usando SimpleXml
  • Utilizzare usort per ordinare la matrix che contiene gli elementi di background.
  • Opzionalmente, esportlo nuovamente in XML (non esiste una function predefinita per farlo)

Usort avrebbe funzionato come segue:

 function comp($a, $b) { return $b->Uses - $a->Uses; } usort($xml->Backgrounds, 'comp'); 

Un altro modo è usare un XSLT, con qualcosa di simile a questo:

 <xsl:sort select="Uses"/> 

Esempio di sorting con XSLT

File XML:

 <employees> <employee hireDate="04/23/1999"> <last>Hill</last> <first>Phil</first> <salary>100000</salary> </employee> <employee hireDate="09/01/1998"> <last>Herbert</last> <first>Johnny</first> <salary>95000</salary> </employee> <employee hireDate="08/20/2000"> <last>Hill</last> <first>Graham</first> <salary>89000</salary> </employee> </employees> 

File XSLF:

 <!-- xq424.xsl: converts xq423.xml into xq425.xml --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="employees"> <xsl:apply-templates> <xsl:sort select="salary"/> </xsl:apply-templates> </xsl:template> <xsl:template match="employee"> Last: <xsl:apply-templates select="last"/> First: <xsl:apply-templates select="first"/> Salary: <xsl:apply-templates select="salary"/> Hire Date: <xsl:apply-templates select="@hireDate"/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet> 

Fonte: http://www.xml.com/pub/a/2002/07/03/transform.html

Controlla i predicati qui: http://www.w3schools.com/XPath/xpath_syntax.asp per gli ultimi tre nodes.