【问题标题】:Need to use php foreach to create XML elements and attributes using a second XML需要使用 php foreach 使用第二个 XML 创建 XML 元素和属性
【发布时间】:2016-08-05 16:30:45
【问题描述】:

我有一个 XML 文档 (traffic.xml),然后我使用 PHP 使用 foreach 仅提取 2 个特定属性,因为原始 XML 中有大量属性来创建 PHP(drivetimeFetch.php)。

我现在需要做的是,使用drivetimeFetch.php,我需要创建另一个xml 文档(carousel_Traffic.xml),其中的元素和属性由我创建的剥离drivetimeFetch.php 中的大约30 行组成。这是我卡住的地方。我能够编写元素和属性,但是如何将每一行放入自己的元素块中。

这是我的 php 的样子:

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

我需要的是让 carousel_Traffic.xml 看起来像这样:

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

对于drivetimeFetch.php 中的每一行,我猜这是一个foreach 操作,但我不知道如何做到这一点,以便每一行的pathNamedriveTimeMinutes 都有自己的元素堵塞。如您所见,我让它只适用于一行。

【问题讨论】:

    标签: php xml foreach


    【解决方案1】:

    考虑 XSLT 将输入 XML 转换为最终输出。不需要 XML 文档的循环或字符串连接:

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

    输出

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

    【讨论】:

    • 谢谢芭菲!我最终做的是在第一个 fwrite ($f, $xml_txt.) 之后添加 foreach。
    • 我已更新以适合您的实际输出。重新考虑此解决方案或任何其他使用 DOM 方法(createElement()appendChild() 等)的解决方案。不要将字符串连接到 XML 文档中。 XML 文件不是文本文件。
    • 谢谢你,冻糕。感谢您的帮助!
    • 完成。再次感谢!
    【解决方案2】:

    我明白了!玩了一圈之后,我明白了。这是我的工作代码:

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

    这是输出:

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

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多