2017-06-28 5 views
0

Ich habe für 10 Tage zu kämpfen versuchen, eine XML-Feed zu machen:XML-Verarbeitung, Bestellung und Looping

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

ich simplexml versucht haben, xmlDOM und XSLT alle Nuancen. Meine Programmierfähigkeiten sind im Moment ein wenig herausgefordert, ich weiß nicht, ob es die Medikamente sind, die mein Doktor mir gegeben hat, oder ich werde gerade alt und sollte den Hacking-Code aufgeben.

Ich habe in mehrdimensionale Arrays, JSON und XML-Stylesheets geschaut, XSLT ist sehr langweilig, mag nicht mein XML und stört mein Stylesheet.

Ich möchte die XML machen können, indem sie die Anzeige entweder date_updated oder Preis bestellen, die Begrenzung der Ergebnisse durch Status und der Lage sein, die Anzahl der Datensätze zu n zu begrenzen.

Hier ist mein Code, um jedes Element in ein Array zu platzieren, aber ich kann keine Sortierung so machen.

<?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

Antwort

0

XSLT Reconsider da es eine Methode sort beibehält. Zur Veranschaulichung transformiert unten der ursprüngliche XML-Feed in ein XML mit Eigenschaften, sortiert nach Preis in absteigender Reihenfolge, wählt nur bestimmte Elemente aus, Filter auf die ersten 5 (&lt; entspricht <) und nur Elemente mit status = 'Let'.

XSLT(speichern als XSL-Datei oder eingebetteten PHP-String)

<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(sicher sein, php-xsl Erweiterung aktiviert in INI-Datei haben)

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

?> 

Ausgabe

<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>