检查 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>';
我有点卡在这里。为了 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>';