检查Child是否已在XML文件中

时间:2017-07-10 15:33:10

标签: xml foreach attributes markers processwire

我有点卡在这里。出于具有不同位置的多个图标的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

1 个答案:

答案 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>';