Сравните и отфильтруйте два XML-файла в Stack Overflow

Я хочу сравнить два XML-файла в PHP (фактически фильтровать один за другим), один XML-файл содержит, например, данные «интерфейсы», другой содержит интерфейсы (rule.xml), но с меньшим количеством элементов, именно то, что я хочу и хочу получить отфильтрованные данные, которые находятся в обоих xmls.

Первый xml:

`<?xml version="1.0" encoding="UTF-8"?>
<data>
<interfaces>
<interface>
<name><!-- type: string --></name>
<type><!-- type: string --></type>
<mtu><!-- type: int32 --></mtu>
<interface>
</interfaces>
</data>`

Второй xml:

`<?xml version="1.0" encoding="UTF-8"?>
<data>
<interfaces>
<interface>
<name>interfacename</name>
<type>gigaeth</type>
<mtu>1500</mtu>
<counters>
<inBytes>17800</inBytes>
<inPackets>156000</inPackets>
<inErrors>850</inErrors>
</counters>
</interface>
</interfaces>
</data>`

Итак, результат, который я хочу получить:

`<?xml version="1.0" encoding="UTF-8"?>
<data>
<interfaces>
<interface>
<name>interfacename</name>
<type>gigaeth</type>
<mtu>1500</mtu>
</interface>
</interfaces>
</data>`

3

Решение

Использование simplexml для рекурсивного обхода обоих деревьев xml синхронно. В листовом узле первого xml проверьте, что тот же самый узел присутствует во втором и измените значение

$xml1 = new SimpleXMLElement($str1);
$xml2 = new SimpleXMLElement($str2);

function set(&$xml, $xml2) {
foreach($xml as $key => $xmlpos) {
if (isset($xml2->$key))
if($xmlpos->count()) set($xmlpos, $xml2->$key);
else  $xml->$key =  $xml2->$key;
}
}

set($xml1, $xml2);
echo $xml1->saveXML();
2

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

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

По вопросам рекламы [email protected]