我有点卡在这里。出于具有不同位置的多个图标的Google地图的目的,我需要XML格式的数据。我们的想法是检查条目(由Processwire中的ID标识)是否已存在于XML文件中。如果是的话,就没有什么必须做的。如果不是,则必须将其添加到文件中。此外,如果id在XML文件上但不在数据库上(因为它必须被删除),则需要将其删除。
这是我到目前为止所做的:
$file = 'xml/markers.xml';
$xml = simplexml_load_file($file);
foreach ($pages->get('/produzenten/')->prod_repeater as $produzent) {
$marker = $xml->addChild("marker");
$marker->addAttribute('id', $produzent->id);
$marker->addAttribute('name', $produzent->prod_name);
$marker->addAttribute('address', $produzent->prod_objekt . ', 8625 Gossau' );
$marker->addAttribute('type', $produzent->prod_kategorie);
$marker->addAttribute('lat', $produzent->geo_lg);
$marker->addAttribute('lng', $produzent->geo_bg);
file_put_contents('xml/markers.xml', $xml->asXML());
}
这很有效,但每次调用网站时都会将整个条目添加到文件中,这不是我想要的。
有任何帮助吗?
以下是我们正在讨论的XML文件:Markers
答案 0 :(得分:0)
您可以使用与访问数组或对象相同的语法来访问xml元素:
$xml->someList[3]["someAttribute"];
当然,你可以比较价值并决定做什么。
为了测试我改变了你的代码,但我想你会得到这个想法:
(这也许不是最优雅的解决方案.idk)
<?php
$file = './markers.xml';
$xml = simplexml_load_file($file);
$prods = [
[1, 'mark'],
[2, 'anne'],
[3, 'bernd'],
[4, 'rose']
];
foreach ($prods as $prod) {
$prodExists = false;
foreach ($xml as $xmlMarker) {
if($xmlMarker['id'] == $prod[0]) $prodExists = true;
}
if($prodExists) continue;
$marker = $xml->addChild('marker');
$marker->addAttribute('id', $prod[0]);
$marker->addAttribute('name', $prod[1]);
}
file_put_contents('./markers.xml', $xml->asXML());
你也可能不应该在循环中file_put_contents
,你将在循环的每一次迭代中写入磁盘。而是在循环之后将文件写出一次
只要你->addChild()
新的子项被添加到内存中的xml树中,你就可以将它们虚拟地堆积起来,直到你最终将文件写出来。
修改强>
哦...当然......你基本上只是想把你的ProcessWire数据中的所有$ prods放到一个新的XML文件中(保留现有的prods,添加新的,删除不存在的=&gt;只需将所有的prods放入一个新文件)
<?php
$newXml = new SimpleXMLElement('<markers></markers>');
$prods = $pages->get('/produzenten/')->prod_repeater;
foreach($prods as $prod) {
$marker = $xml->addChild("marker");
$marker->addAttribute([...]); // all your attributes
}
file_put_contents('xml/markers.xml', $newXml->asXML());
<强> EDIT2:强>
......甚至更好:
创建一个新模板(例如produzenten.xml.php)和一个将输出xml文件的页面(例如produzenten.xml)。所以网址是这样的:www.domain.ch/produzenten/produzenten.xml
这也可以缓存,如果“Produzenten”页面发生变化,您可以设置删除缓存的规则。
模板文件可能就是这样:
<?php
header('Content-type: application/xml');
echo '<?xml version="1.0" standalone="yes"?><markers>';
foreach($pages->get('/produzenten/')->prod_repeater as $prod) {
echo '<marker id="' . $prod->id . '" name="' . $prod->name . '"/>';
}
echo '</markers>';