Сортировка XML с помощью SimpleXML / XPath?

У меня есть XML, скажем:

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

Как я могу сортировать XML с самого низкого Uses до самого высокого?

Может быть, выражение xpath?

Кроме того, как я мог просто получить дно 2 Background s или те, которые были недавно добавлены?

Related of "Сортировка XML с помощью SimpleXML / XPath?"

Примеры сортировки с помощью SimpleXML / XPath

Как я могу сортировать XML с самого низкого Uses до самого высокого?

Чтобы отсортировать список элементов с самого низкого до самого высокого, вам нужно создать массив этих элементов, а затем отсортировать этот массив. Выражение xpath может использоваться для получения как массива элементов, подлежащих сортировке, так и данных, которые отсортированы по массиву (sort-key).

Когда ваши XML и дети Uses значение сортировки, он работает следующим образом:

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

Результат:

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

См. array_multisort() и «Как отсортировать многомерный массив в php» .


Кроме того, как я мог просто получить дно 2 Background s или те, которые были недавно добавлены?

Это можно сделать только с xpath:

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

И если последнее добавленное означает, что сверху, а не внизу:

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

Возможное решение:

  • Разбирайте XML с помощью SimpleXml
  • Используйте usort для сортировки массива, содержащего элементы фона.
  • Необязательно, экспортируйте его в XML снова (для этого нет встроенной функции)

Функция Usort будет работать следующим образом:

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

Другой способ – использовать XSLT с чем-то вроде этого:

 <xsl:sort select="Uses"/> 

Пример сортировки с помощью XSLT

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> 

Файл 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> ? <!-- 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> 

Источник: http://www.xml.com/pub/a/2002/07/03/transform.html

Проверьте предикаты здесь: http://www.w3schools.com/XPath/xpath_syntax.asp для последних трех узлов.