使用PHP,Foreach和Dom下载并合并多个XML文件

时间:2018-01-27 17:26:42

标签: php xml merge domdocument

我有一周因为这个问题而破坏了我的牙齿:我试图下载并动态地将多个xml文件与API合并。我可以下载所有文件,但我无法合并它们而没有多个根元素......令人沮丧,我找不到任何建议。这是我的代码:

<?php 

$fileout = 'file.xml';
unlink($fileout);


$baseurl="https://websitewithapi.com/";
$topcategories=array("COOL","DRIVE","FUN");
foreach ($topcategories as $topcategory) {
$url_cata_test="https://websitewithapi.com/&filters=topcategory:$topcategory&limit=1";
$jsontest = file_get_contents($url_cata_test);
$arrtest=json_decode($jsontest);
$items=$arrtest->pagination->count;
$pagemax=ceil($items/250);


$pagetest= range(0,$pagemax);

foreach ($pagetest as $page) {
$url_cata="$baseurl&filters=topcategory:$topcategory&offset=$page&limit=250";

echo "Cat en cours d import: ".$topcategory."\n";
echo "Page en cours d import: ".$page."\n";
echo "URL Cata: $url_cata \n";


};


$dom = new DOMDocument();
$dom->appendChild($dom->createElement('superdeals'));


$files= array($url_cata);

foreach ($files as $filename) {


$addDom = new DOMDocument();
$addDom->load($filename);




if ($addDom->documentElement->getElementsByTagName('products')) {
foreach ($addDom->documentElement->getElementsByTagName('product') as $node) {
$dom->documentElement->appendChild(
$dom->importNode($node, TRUE)
);



}
}

$dom->formatOutput = true;
file_put_contents($fileout, $dom->saveXML(), FILE_APPEND);


}


};


?>

我和&#34;关联&#34;我总是遇到同样的问题。文件在同一个文件中,但有多个根!有什么我想念的吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

看起来你正在添加名为&#34; superdeals&#34;的根元素。到您的文档,然后在根级别添加每个文件的内容。 您需要将每个文件的内容添加为&#34; superdeals&#34;的子项。元素,而不是文档的孩子。 保存根节点:

$root = $dom->appendChild($dom->createElement('superdeals'));

然后代替

$dom->documentElement->appendChild($dom->importNode($node, TRUE))

将child添加到根节点(而不是文档节点):

$root->appendChild($dom->importNode($node, TRUE))

Document元素可以包含除根元素之外的节点,例如实体定义,处理指令等。

答案 1 :(得分:0)

只需初始化DOM对象并将其文件输出保存在所有四个foreach循环之外。目前,您对每次迭代使用FILE APPEND,这不是XML DOM方法,而只是连接文本内容。继续在循环中扩展XML树,然后输出单数XML一次,不附加任何文件。

$fileout = 'file.xml';
unlink($fileout);

// INITIALIZE DOM TREE
$dom = new DOMDocument();
$dom->appendChild($dom->createElement('superdeals'));

...

foreach ($topcategories as $topcategory) {
   ...
   foreach ($pagetest as $page) {
      ...
      foreach ($files as $filename) {
         ...
         foreach ($addDom->documentElement->getElementsByTagName('product') as  $node) {
            $dom->documentElement->appendChild(
                  $dom->importNode($node, TRUE)
            );
         }
      }
   }
}

// OUTPUT DOM TREE
file_put_contents($fileout, $dom->saveXML());