我有一周因为这个问题而破坏了我的牙齿:我试图下载并动态地将多个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;我总是遇到同样的问题。文件在同一个文件中,但有多个根!有什么我想念的吗?
谢谢。
答案 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());