Мой XML-файл выглядит следующим образом — я хочу (упрощенно для примера) добавить 1 к каждому значению узла, а затем проверить наличие дубликатов. Если дублирующий узел существует в, я хочу удалить родителя, а затем вернуть все с уникальным как XML.
<?xml version="1.0" encoding="UTF-8"?>
<channel>
<item>
<gid>1240</gid>
</item>
<item>
<gid>1440</gid>
</item>
<item>
<gid>1440</gid>
</item>
<item>
<gid>246</gid>
</item>
Таким образом, мой желаемый результат будет:
<?xml version="1.0" encoding="UTF-8"?>
<channel>
<item>
<gid>1241</gid>
</item>
<item>
<gid>1441</gid>
</item>
<item>
<gid>247</gid>
</item>
Мой код выглядит так — часть манипуляции решена, но я не могу понять, как проверить, является ли новый дубликат, а затем удалить его родительский элемент, прежде чем вернуть его в виде XML. Я думаю, что хранить все значения в виде массива в цикле правильно, но после этого я застреваю. Благодарю за любую помощь.
<?php
$xmllink = 'items.xml';
header("Content-type: text/xml");
$xml=simplexml_load_file($xmllink) or die("Error: Cannot create object");
$xml->channel;
foreach ($xml as $anything) {
// find the <gid>
$newgid = $anything->gid;
// manipulate <gid>
$anything->gid = $newgid +1;
// store all gid + 1 in array
$allgids[] = $newgid;}
echo $xml->asXML();
?>
SimpleXML не очень хорош, когда вы хотите изменить структуру документа.
Но вы можете сделать это, немного поработав. Во-первых, любая манипуляция с документом затруднена, если вы пытаетесь повторить его одновременно. Вот почему я использовал XPath, чтобы получить список элементов, а затем перебрать этот список. Если предмет уже есть, я использую unset()
удалить это. (Имейте более глубокое чтение Удалить потомка с определенным атрибутом в SimpleXML для PHP для полного ответа на то, как это работает).
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$xmlDoc = <<< XML
<?xml version="1.0" encoding="UTF-8"?>
<channel>
<item>
<gid>1240</gid>
</item>
<item>
<gid>1440</gid>
</item>
<item>
<gid>1440</gid>
</item>
<item>
<gid>246</gid>
</item>
</channel>
XML;
$xml = simplexml_load_string($xmlDoc);
$allgids = [];
$items = $xml->xpath("//item");
foreach ($items as $item) {
// find the <gid>
$newgid = $item->gid;
// manipulate <gid>
$item->gid = $newgid +1;
if ( in_array($newgid, $allgids)) {
unset($item[0]);
}
else {
// store all gid + 1 in array
$allgids[] = (string)$newgid;
}
}
echo $xml->asXML();
Хотя в этом примере я использую код из строки, то же самое будет применяться при загрузке его из файла, как вы.
Других решений пока нет …