检查 Child 是否已经在 XML 文件中

Check if Child is already in XML File

我有点卡在这里。为了 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-File:Markers

您可以使用与访问数组或 objects:

相同的语法简单地访问 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() 一个新的 child 被添加到内存中的 xml 树中,你就可以虚拟地堆积它们直到你最终写出文件。

编辑:

哦……当然……您基本上只是想将 ProcessWire 数据中的所有 $prods 放入一个新的 XML 文件中(保留现有产品、添加新产品、删除不存在的产品 => 只是把所有产品放在一个新文件中)

<?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)和一个页面(例如produzenten.xml)将输出xml文件。所以 url 会是这样的: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>';