0

我有点卡在这里。对于具有不同地点的多个图标的 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 文件:标记

4

1 回答 1

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,添加新的,删除不存在的 => 只需将所有的 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());

编辑2:

...甚至更好:

创建一个新模板(例如 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>';
于 2017-07-11T10:37:11.047 回答