2017-06-28 52 views
0

我一直在掙扎了10天試圖呈現一個XML飼料:XML處理,排序和循環

http://feed.harjbains.gnomen-europe.com/xml-feed/

我已經試過simplexmlxmlDOM和XSLT都有細微差別。我的編程技能目前有點挑戰,我不知道這是我的醫生給我的藥物,還是我變老了,應該放棄黑客代碼。

我特地到多維數組,JSON和XML樣式表,XSLT是非常繁瑣不喜歡我的XML和我的樣式表干擾。

我希望能夠通過顯示它或者日期date_updated價格秩序,限制的結果通過狀態渲染XML,並能夠記錄的數量限制爲ñ

這裏是我的代碼,每個元素放置到數組但我不能做任何的排序是這樣的。

<?php 
    $xml = simplexml_load_file("http://feed.harjbains.gnomen-europe.com/xml-feed/"); 

    $properties = $xml; 

    $id    = array(); 
    $beds   = array(); 
    $baths   = array(); 
    $price   = array(); 
    $address1  = array(); 
    $area   = array(); 
    $postcode  = array(); 
    $date_updated = array(); 
    $transaction = array(); 
    $status   = array(); 
    $image   = array(); 
    $img   = array(); 
    $description = array(); 

    $i=0; 
    $totrecs=0; 
    foreach ($properties as $property) { 
     $i=$i+1; 
     $address[$i]  = $property->address1; 
     $id[$i]   = $property->id; 
     $beds[$i]   = $property->beds; 
     $baths[$i]  = $property->baths; 
     $price[$i]  = $property->price; 
     $address1[$i]  = $property->address1; 
     $area[$i]   = $property->area; 
     $postcode[$i]  = $property->postcode; 
     $date_updated[$i] = $property->date_updated; 
     $transaction[$i] = $property->transaction; 
     $status[$i]  = $property->status; 
     $image[$i]  = $property->image; 
     $description[$i] = $property->description; 
     $totrecs   = count($id); 

     if(isset($property->image->img)) { 
      //echo $address1[$i]."<BR>"; 
      $image[$i] = true; 
      $x=0; 
      foreach($property->image->img as $a) { 
       $img[$i][$x]= $a; 
       //echo $img[$i][$x]."<BR>"; 
       $x=$x+1; 
      } 
     } else { 
      $image[$i] = false; 
     } 
    } 
?> 

Harj

回答

0

重新考慮XSLT因爲它維持一個sort方法。出於演示的,下面變換原始XML饋送到XML與由價格降序排序的特性,僅選擇特定的元件,過濾器,以第一5(&lt;相當於<),並且僅與元件狀態='讓

XSLT(保存爲文件名爲.xsl或嵌入PHP字符串)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/properties"> 
    <xsl:copy> 
     <xsl:apply-templates select="property[position() &lt; 6 and status='Let']"> 
      <xsl:sort select="translate(price, ',', '')" data-type="number" order="descending"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="property"> 
    <xsl:copy> 
    <xsl:copy-of select="id|beds|baths|price|address1|area|postcode|date_updated|transaction|status|image|img|description"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

PHP(一定要在.ini文件中啓用了PHP的XSL擴展)

<?php 

// LOAD XML FEED 
$xml = simplexml_load_file("http://feed.harjbains.gnomen-europe.com/xml-feed/"); 

// LOAD XSLT SCRIPT 
$xsl = new DOMDocument; 
$xsl->load('XSLT_Script.xsl'); // OR $xsl->loadXML($xslstring); 

// INITIALIZE TRANSFORMER 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl);  

// TRANSFORM SOURCE TO NEW TREE 
$newXML = $proc->transformToXML($xml); 

// ECHO OUTPUT 
echo $newXML; 

// SAVE OUTPUT TO FILE 
file_put_contents('Output.xml', $newXML); 

?> 

輸出

<properties> 
    <property> 
     <id>1184</id> 
     <beds>3</beds> 
     <baths>3</baths> 
     <image> 
     </image> 
     <price>695</price> 
     <area>Wolverhampton</area> 
     <address1>Park Hall Road</address1> 
     <description>A vastly extended three bedroom semi-detached property. Just been totally re-furbished. Comprising of front reception room, extended through lounge, third room which can be used as fourth bedroom. This leads into a shower room which has WC and basin. Utility room with plumbing. Fitted kitchen with gas cooker and hob. To the first floor, master bedroom with en-suite. Two further double bedrooms and family bathroom. Rear garden and front garden with drive for off-road parking.</description> 
     <postcode>WV4 5DU</postcode> 
     <date_updated></date_updated> 
     <transaction>2</transaction> 
     <status>Let</status> 
    </property> 
    <property> 
     <id>1176</id> 
     <beds>3</beds> 
     <baths>1</baths> 
     <image> 
     </image> 
     <price>575</price> 
     <area>Wolverhampton</area> 
     <address1>Park Hall Road</address1> 
     <description>A very well presented three bedroom semi-detached property which has been totally re-furbished. Living room, leading to dining room and fitted kitchen with cooker. Three bedrooms and new family bathroom with shower. New flooring and carpets throughout. Double glazed and gas central heated. Rear garden with patio, front garden with drive leading to garage. Available immediately.</description> 
     <postcode>WV4 5DU</postcode> 
     <date_updated></date_updated> 
     <transaction>2</transaction> 
     <status>Let</status> 
    </property> 
    <property> 
     <id>1181</id> 
     <beds>3</beds> 
     <baths>1</baths> 
     <image> 
     </image> 
     <price>550</price> 
     <area>Willenhall</area> 
     <address1>Westfield Road</address1> 
     <description>A very well presented three bedroom semi-detached property. Front reception room, large fitted kitchen with dining area. To the first floor, three bedrooms and modern family bathroom with separate shower cubicle. Front garden with space for off-road parking, rear garden. Double glazed and central heated throughout. Available immediately.</description> 
     <postcode>WV13 3JX</postcode> 
     <date_updated></date_updated> 
     <transaction>2</transaction> 
     <status>Let</status> 
    </property> 
    <property> 
     <id>1174</id> 
     <beds>3</beds> 
     <baths>1</baths> 
     <image> 
     </image> 
     <price>550</price> 
     <area>Willenhall</area> 
     <address1>Sandringham Avenue</address1> 
     <description>Three bedroom semi-detached property in popular residential area. Comprising of through lounge, fitted kitchen. Patio door to rear garden. Three bedrooms to first floor. Family bathroom with shower. Garage to side, front garden and off-road parking. Available immediately.</description> 
     <postcode>WV12 5TF</postcode> 
     <date_updated></date_updated> 
     <transaction>2</transaction> 
     <status>Let</status> 
    </property> 
    <property> 
     <id>1177</id> 
     <beds>3</beds> 
     <baths>1</baths> 
     <image> 
     </image> 
     <price>500</price> 
     <area>Willenhall</area> 
     <address1>Marshall Road</address1> 
     <description>Three bedroom semi-detached property. Comprising of two reception rooms, fitted kitchen to ground floor. Three bedrooms and family bathroom to first floor. Double glazed and central heated throughout. Front and rear gardens. Available immediately.</description> 
     <postcode>WV13 3PB</postcode> 
     <date_updated></date_updated> 
     <transaction>2</transaction> 
     <status>Let</status> 
    </property> 
</properties>