【问题标题】:Download and merge multiple XML files with PHP, Foreach and Dom使用 PHP、Foreach 和 Dom 下载并合并多个 XML 文件
【发布时间】:2018-07-06 19:15:54
【问题描述】:

自从一个星期以来,我一直在为这个问题而烦恼:我正在尝试使用 API 下载和动态合并多个 xml 文件。我可以下载所有文件,但如果没有多个根元素,我就无法合并它们……这令人沮丧,我找不到任何建议。这是我的代码:

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


}


};


?>

我总是在同一个文件中“关联”文件但有多个根时遇到同样的问题!有什么我想念的吗?

谢谢。

【问题讨论】:

    标签: php xml merge domdocument


    【解决方案1】:

    只需初始化 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());
    

    【讨论】:

      【解决方案2】:

      看起来您正在向文档中添加名为“superdeals”的根元素,然后在根级别添加每个文件的内容。 您需要将每个文件的内容添加为“superdeals”元素的子元素,而不是文档的子元素。 保存根节点:

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

      然后代替

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

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

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

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

      【讨论】:

      • 是的,我同意,但如何?
      • @Sébastien 我已经编辑了答案(未经测试,但应该给你一个想法)。
      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多