Я хочу сравнить два 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>`
Использование 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();
Других решений пока нет …