2016-08-05 22 views
0

Ich habe ein XML-Dokument (traffic.xml), die ich dann verwendet, um nur 2 spezifische Attribute mit foreach ziehen, da es eine Tonne von ihnen in der ursprünglichen XML ist um ein PHP zu erstellen (drivetimeFetch.php).Benötigen Sie PHP foreach zum Erstellen von XML-Elementen und Attributen mit einem zweiten XML

Was ich jetzt zu tun brauchen, mit drivetimeFetch.php, ich brauche eine andere XML-Dokument erstellen (carousel_Traffic.xml) mit Elementen und aus den 30 oder so Linien Attribute aus dem abgestreiften drivetimeFetch.php ich herstellte. Hier bleibe ich stecken. Ich konnte die Elemente und Attribute schreiben, aber wie bekomme ich jede Zeile in einen eigenen Elementblock. Hier

ist, was meine php wie folgt aussieht:

<?php 
$xml1 = new SimpleXMLElement(file_get_contents('https://wsidata.weather.com/201303/en-us/55828880/traffic.xml')); 
foreach ($xml1->drivetimes->drivetime as $drivetime) { 
    echo"<br>"; 
    echo $drivetime['pathName'].":"." ".$drivetime['driveTimeMinutes']."min \n" ; 
} 
$xml_txt = '<?xml version="1.0" encoding="UTF-8"?>'."\r\n".'<tickerfeed version="2.4">'."\r\n". 
      '<playlist type="scrolling_carousel" name="TrafficScroll" target="carousel">'."\r\n" ; 
$element = '<element>'; 
$elementClose = '</element>'; 
$field1 = '<field name="05">';   
$fieldClose = '</field>'; 
$playlistClose = '</playlist>'; 
$tickerfeedClose = '</tickerfeed>'; 

$f = fopen("C:\\Users\\Administrator\\Desktop\\carousel_Traffic.xml", "w"); 
fwrite ($f, $xml_txt. "\r\n"); 
fwrite ($f, $element. "\r\n"); 
fwrite ($f, $field1. $drivetime['pathName'].":"." ".$drivetime['driveTimeMinutes']."min " . $fieldClose. "\r\n"); 
fwrite ($f, $elementClose. "\r\n"); 
fwrite ($f, $playlistClose. "\r\n"); 
fwrite ($f, $tickerfeedClose. "\r\n"); 
fclose ($f); 
?> 

Was ich daraus müssen, ist zu bekommen, dass carousel_Traffic.xml aussehen, ist dies:

<?xml version="1.0" encoding="UTF-8"?> 
<tickerfeed version="2.4"> 
<playlist type="scrolling_carousel" name="TrafficScroll" target="carousel"> 

<element> 
<field name="05">I-278: Bklyn Battery Tunnel to Brooklyn Bridge: 10min </field> 
</element> 
</playlist> 
</tickerfeed> 

Für jede dieser Linien in der drivetimeFetch.php, ich denke, das ist eine foreach-Operation, aber ich habe keine Ahnung, wie das zu tun, so dass die pathName und driveTimeMinutes für jede Zeile einen eigenen Element-Block bekommt. Wie Sie sehen können, habe ich es für nur eine Zeile arbeiten lassen.

Antwort

0

XSLT Betrachten Sie die Eingabe von XML in Ihre End-Ausgabe zu verwandeln. Keine Schleife oder String-Verkettung von XML-Dokument wird benötigt:

// LOAD XML SOURCE 
$xml1 = new SimpleXMLElement(file_get_contents('https://wsidata.weather.com/201303/en-us/55828880/traffic.xml')); 

// XSLT STRING 
$xslstr = '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
      <xsl:output version="1.0" encoding="UTF-8" method="xml" indent="yes" /> 
      <xsl:strip-space elements="*"/> 

       <xsl:template match="node()|@*"> 
       <xsl:copy> 
        <xsl:apply-templates select="node()|@*" /> 
       </xsl:copy> 
       </xsl:template> 

       <xsl:template match="traffic"> 
        <tickerfeed version="2.4"> 
         <playlist type="scrolling_carousel" name="TrafficScroll" target="carousel">    
          <xsl:apply-templates select="drivetimes" /> 
         </playlist> 
        </tickerfeed> 
       </xsl:template> 

       <xsl:template match="incidents"/> 

       <xsl:template match="drivetimes"> 
        <element> 
         <template>Traffic</template> 
         <xsl:apply-templates select="drivetime"/> 
        </element> 
       </xsl:template> 

       <xsl:template match="drivetime"> 
        <field name="05"><xsl:value-of select="concat(@pathName, \': \', @driveTimeMinutes, \'min\')"/></field> 
       </xsl:template> 

      </xsl:stylesheet>'; 

$xslfile = new SimpleXMLElement($xslstr); 

// TRANSFORM XML with XSLT 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xslfile); 
$newXML = $proc->transformToXML($xml1); 

// OUTPUT TO FILE 
file_put_contents('C:\\Users\\Administrator\\Desktop\\carousel_Traffic.xml', $newXML); 

Ausgabe

<?xml version="1.0" encoding="UTF-8"?> 
<tickerfeed version="2.4"> 
    <playlist type="scrolling_carousel" name="TrafficScroll" target="carousel"> 
    <element> 
     <template>Traffic</template> 
     <field name="05">I-95: Bruckner Interchange to I-95 Northbound - Midland Ave/Exit 22: 22min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">Belt Pkwy: Verrazano Brg to Southern State Pkwy E Eastbound - Nassau/Queens County Line: 62min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">I-95 Northbound - Alexander Hamilton Brg to Bruckner Interchange: 14min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">Bronx River Pkwy: Cross County Pkwy to Bruckner Expressway: 37min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">I-278: Verrazano to Belt Merge: 3min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">Belt Pkwy: Southern State Pkwy to Van Wyck Expwy: 8min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">Belt Pkwy: Ocean Pkwy to Verrazano Brg: 9min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">Verrazano Brg to Brooklyn Brg: 2min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">NYS Thruway: I-287 to Tappan Zee Bridge Tolls: 17min</field> 
    </element> 
    <element> 
     <template>Traffic</template> 
     <field name="05">Major Deegan Expwy: Macombs Dam Brg to Third Ave Bridge: 2min</field> 
    </element> 
    <element> 
... 
+0

Danke Parfait! Was ich dabei tat, war das Hinzufügen der foreach direkt nach dem ersten fwrite ($ f, $ xml_txt.) – RunawayPhish

+0

Ich aktualisiert, um Ihre tatsächliche Ausgabe anzupassen. Überdenken Sie diese Lösung oder andere, die [DOM] (http://php.net/manual/en/class.domdocument.php) -Methoden verwenden ('createElement()', 'appendChild()' usw.). Verketten Sie keine Zeichenfolgen in einem XML-Dokument. XML-Dateien sind keine Textdateien. – Parfait

+0

Danke, Parfait. Ich schätze die Hilfe! – RunawayPhish

0

Ich habe es! Nachdem ich herumgespielt habe, habe ich es herausgefunden. Hier ist mein Arbeitscode:

<?php 
$xml1 = new SimpleXMLElement(file_get_contents('https://wsidata.weather.com/201303/en-us/55828880/traffic.xml')); 
foreach ($xml1->drivetimes->drivetime as $drivetime) { 
    echo"<br>"; 
    echo $drivetime['pathName'].":"." ".$drivetime['driveTimeMinutes']."min \n" ; 
} 
$xml_txt = '<?xml version="1.0" encoding="UTF-8"?>'."\r\n".'<tickerfeed version="2.4">'."\r\n". 
      '<playlist type="scrolling_carousel" name="TrafficScrollIN" target="carousel">'."\r\n" ; 
$element = '<element>'; 
$elementClose = '</element>'; 
$field1 = '<field name="05">';   
$fieldClose = '</field>'; 
$playlistClose = '</playlist>'; 
$tickerfeedClose = '</tickerfeed>'; 
$template = '<template>'; 
$templateClose = '</template>'; 

$f = fopen("C:\\Users\\Administrator\\Desktop\\PIX_Traffic.xml", "w"); 

fwrite ($f, $xml_txt. "\r\n"); 
foreach ($xml1->drivetimes->drivetime as $drivetime){ 
fwrite ($f, $element. "\r\n"); 
fwrite ($f, $template. "Traffic" . $templateClose. "\r\n"); 
fwrite ($f, $field1. $drivetime['pathName'].":"." ".$drivetime['driveTimeMinutes']."min " . $fieldClose. "\r\n"); 
fwrite ($f, $elementClose. "\r\n"); 
} 
fwrite ($f, $playlistClose. "\r\n"); 
fwrite ($f, $tickerfeedClose. "\r\n"); 
fclose ($f); 
?> 

Dies ist die Ausgabe:

<?xml version="1.0" encoding="UTF-8"?> 
<tickerfeed version="2.4"> 
<playlist type="scrolling_carousel" name="TrafficScrollIN" target="carousel"> 

<element> 
<template>Traffic</template> 
<field name="05">Williamsburg Brg to Long Island Expwy: 11min </field> 
</element> 
<element> 
<template>Traffic</template> 
<field name="05">I-278: Bklyn Battery Tunnel to Brooklyn Bridge: 4min </field> 
</element> 
<element> 
<template>Traffic</template> 
<field name="05">Major Deegan Expwy: Third Ave Bridge to Major Deegan Expwy Southbound - I-278/Bruckner Expy: 3min </field> 
</element> 
</playlist> 
</tickerfeed> 
+0

Während dieser Code-Schnipsel, die Frage lösen kann, [einschließlich einer Erklärung] (// meta.stackexchange.com/ Fragen/114762/Erklären-vollständig-Code-basierte Antworten) hilft wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen! –