使用simpleXML对xml输出的顺序进行排序

时间:2015-02-24 20:07:20

标签: php xml sorting simplexml

我正在使用正在用作“数据库”的XML文件。在这个例子中,它包含有关书籍的信息。

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
</catalog>

然后我想使用simpleXML在我的页面中显示图书的价格。 但我的客户要求“排序依据”按钮。我无法在Google和SO中找到任何方法来对simpleXML输出进行排序,让我们说对象属性为“price”。

<?php 

$xml = simplexml_load_file('example.xml');
$number = count($xml->book);        
        //Looping through the xml.
        for($i = 0; $i < $number; $i++) {   ?>
            <div class="info">
                <span><?php echo((string) $xml->book[$i]->price); ?></span>
            </div>
    <?php } ?>

就像现在一样,它只是按照它们在xml中编写的顺序向我展示了这本书的价格。 我想可能会使用JS进行此操作,但似乎不太可能,因为这意味着我必须将所有书籍放在一个页面中。我甚至想过使用SQL然后使用ORDER BY子句,但问题是这个XML是动态的并且一直在变化,这意味着我需要始终关注XML文件中的更改并自动更新SQL数据库,我不知道该怎么做。我真正想要的是使用PHP改变XML的顺序,是否可能?

1 个答案:

答案 0 :(得分:0)

不可能直接。您必须从xml构建一个数组,对该数组进行排序,然后重新构建xml。创建2个数组,一个用于保留xml段,其中索引是book_id,值是段。第二个,仅将book id作为键,并使用asort作为要排序的字段的值。对第二个数组进行排序并重建xml。

== UPDATE ==

也许有可能使用xPath和XSL对xml进行排序,这里有一个link