Как я могу удалить родительский элемент после появления дубликатов в значении узла после манипулирования значениями узлов файлов XML с помощью simpleXML?

Мой 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();

?>

0

Решение

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();

Хотя в этом примере я использую код из строки, то же самое будет применяться при загрузке его из файла, как вы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector