尝试使用php合并两个xml文件,然后保存一个新的合并xml。
http://alert.fcd.maricopa.gov/alert/Google/xml/fcdmc_alert_rain_v3.xml和http://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文件。
答案 0 :(得分:2)
由于您需要在两个XML中合并来自rain节点的属性,请考虑使用专用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 (在XSL处理第二个XML时仅加载第一个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"/>
...