【问题标题】:Combine XML Files using PHP使用 PHP 合并 XML 文件
【发布时间】:2017-12-10 21:54:29
【问题描述】:

尝试使用php合并两个xml文件,然后保存一个新合并的xml。

http://alert.fcd.maricopa.gov/alert/Google/xml/fcdmc_alert_rain_v3.xmlhttp://alert.fcd.maricopa.gov/alert/Google/xml/fcdmc_alert_return.xml

<FCDMC>
<rpt_info created="07-06-2017 11:24"/>
<gage_rain id="770" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="1.77" rainscore="1" name="Tat Momolikot Dam [TM]" lat=" 32.65120" long="-111.92830"/>

<FCDMC>
<rpt_info created="07-06-2017 11:23"/>
<return_rain id="770" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0"/>

希望输出看起来像这样

<FCDMC>
<rpt_info created="07-06-2017 11:24"/>
<gage_rain id="770" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="1.77" rainscore="1" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0" name="Tat Momolikot Dam [TM]" lat=" 32.65120" long="-111.92830"/>

我正在尝试编写 PHP 脚本,但没有成功。我没有得到任何结果或错误。 XML 是空白的 http://alert.fcd.maricopa.gov/alert/Google/xml/merged.xml 和 php http://alert.fcd.maricopa.gov/alert/Google/v3/php/merge_test.php。这里是 sript。

$doc1 = new DOMDocument();
$doc1->load('http://alert.fcd.maricopa.gov/alert/Google/xml/fcdmc_alert_rain_v3.xml');

$doc2 = new DOMDocument();
$doc2->load('http://alert.fcd.maricopa.gov/alert/Google/xml/fcdmc_alert_return.xml');

// get 'res' element of document 1
$res1 = $doc1->getElementsByTagName('gage_rain')->item(0); //edited res - items

// iterate over 'item' elements of document 2
$items2 = $doc2->getElementsByTagName('return_rain');
for ($i = 0; $i < $items2->length; $i ++) {
    $item2 = $items2->item($i);

    // import/copy item from document 2 to document 1
    $item1 = $doc1->importNode($item2, true);

    // append imported item to document 1 'res' element
    $res1->appendChild($item1);

}
$doc1->save('http://alert.fcd.maricopa.gov/alert/Google/xml/merged.xml'); //edited -added saving into xml file

有人知道这里有什么问题吗?我希望 php 将所需的输出保存为位置 http://alert.fcd.maricopa.gov/alert/Google/xml/merged.xml 的新合并 xml 文件。

【问题讨论】:

标签: php xml merge


【解决方案1】:

由于您需要合并两个 XML 中雨节点的属性,请考虑使用专用 XML 转换语言 XSLT。使用 XSLT 的 document() 函数,您可以从与 xsl 脚本相关的当前目录或子目录中的外部保存文件进行解析。

PHP 可以运行带有php-xsl 类的XSLT 1.0 脚本,该类在.ini 文件中作为扩展名启用。这种方法不需要for 循环或if 逻辑。

XSLT (另存为 .xsl 文件在同一目录中:alert.fcd.maricopa.gov/alert/Google/xml/)或嵌入为 PHP 字符串)

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

  <xsl:template match="/FCDMC">
    <xsl:copy>
      <xsl:copy-of select="rpt_info"/>
      <xsl:apply-templates select="gage_rain"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="gage_rain">
    <xsl:copy>
        <xsl:variable name="curr_id" select="@id"/>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="document('fcdmc_alert_return.xml')/FCDMC/return_rain[@id=$curr_id]/@*"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

PHP (仅加载第一个 XML,因为 XSL 处理第二个 XML)

// Load the XML source and XSLT file
$cd = dirname(__FILE__);
$doc = new DOMDocument();
$doc->load($cd.'/fcdmc_alert_rain_v3.xml');      

$xsl = new DOMDocument;
$xsl->load($cd.'/XSLT_Script.xsl');           // OR $xsl->loadXML($xslstr);

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($doc);

// Save output to file
$xmlfile = $cd.'/merged.xml';
file_put_contents($xmlfile, $newXml);

输出

<?xml version="1.0"?>
<FCDMC>
  <rpt_info created="07-06-2017  11:39"/>
  <gage_rain id="770" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="1.77" rainscore="1" name="Tat Momolikot Dam [TM]" lat="  32.65120" long="-111.92830" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0"/>
  <gage_rain id="775" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="1.69" rainscore="1" name="Gila R. @ Maricopa Rd. [SP]" lat="  33.17076" long="-112.00601" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0"/>
  <gage_rain id="780" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="1.22" rainscore="1" name="Gila River at Olberg [SP]" lat="  33.08706" long="-111.68700" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0"/>
  <gage_rain id="785" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="2.13" rainscore="1" name="Santa Cruz R. @ SR 84 [SP]" lat="  32.87952" long="-111.82895" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0"/>
  <gage_rain id="795" last_rpt="2017-07-06T06:00:00" min_10="0.00" min_30="0.00" hour_1="0.00" hour_3="0.00" hour_6="0.00" day_1="0.00" day_3="0.00" day_7="0.00" cytd="0.43" rainscore="1" name="Greene Wash @ SR 84 [SP]" lat="  32.87946" long="-111.93369" min10="0" min30="0" hour1="0" hour3="0" hour6="0" day1="0" day3="0" day7="0"/>
  ...

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2018-07-06
    • 2013-01-12
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多