xml diff ( сравнение 2-х xml файлов )

skomoroh

Новичок
xml diff ( сравнение 2-х xml файлов )

подскажите в каком направлении копать(желательно со ссылками)? (на PHP)

нужно сравнить 2 xml файла и вывести все различия и их полный путь

полная задача такая:
есть каталог товаров на хмл( 4 уровня категорий и 3 уровня сам товар ), нужно сравнить новый файл с тем что был и найти все изменения ( и добавления с удалениями ) каталога, например что у 3-го и 23-го товаров изменилась цена, у 16 добавилось новое поле, 25-товар удалили а 45 и 46 - новые и еще появилось новая категория и т.д. ...

вариант через БД - отпадает сразу, так как полностью теряется смысл хмл-я ...
пока вижу варианты:
1) через сабвершен
2) сначала перевести в массивы, потом сравнивать
но понимаю что это изврат получится

заранее спасиба
 

skomoroh

Новичок
Автор оригинала: dark-demon
у товаров идентификаторы заданы?
нет
товары и каталоги идут просто списком, что-то типа "ручная сортировка по имени", без четкой логики

дело в том, что с xml-ем я работал на уровне - загрузить xml-файл, преобразовать в массив, обработать массив, преобразовать в xml, сохранить в файл
интересует в основном: xquery, xpath или xslt - могут помочь? или какие другие инструменты xml или php могут помочь? лучше ткнуть пальцем =о)
 

atv

Новичок
Если структура XML стандартизирована, и не меняется, то проблем никаких нет. Загружаешь XML в DOMDocument или SimpleXML и запускаешь рекурсивную функцию, которая производит сравнение. Xpath и XSLT здесь не нужны.

Если же структура XML может отличаться, то, в общем случае такая задача не решена.
 

Alexandre

PHPПенсионер
Если же структура XML может отличаться, то, в общем случае такая задача не решена
это почему же? так же все грузишь в ДОМ и рекурсивно пошагово сравниваешь....
дедал лет 5 назад похожий алгоритм - сравнение двух хмл файлов. В данном случае структура хмл1 и хмл2 одинаковы, по этому :
приводишь оба хмля к "нормальному" виду... Под нормальным видом понимается упорядочивание по ай-ди или другому критерию (названию товара, щрихкоду (EAN) или иному UIN).
Потом начинаешь сравнение, тот-же алгоритм что и в дифе.
Кстати, вариант использования дифа - это правильная идея, меньше грузит ресурс. А вот привести хмл к "нормальному" виду лучше всего через xslt. я бы даже это сделал внешним процессом, чтоб не тратить пхпешный ресурс.
 

slach

Новичок
http://www.google.com/search?hl=ru&client=opera&rls=ru&hs=HgS&q=xmldiff&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=

тут смотрел??
тебе на php надо ? или пойдет какая нибудь внешняя commandline утилка?
 

atv

Новичок
Поищи по теме "сравнение деревьев".

У меня тоже стояла задача маппить один каталог продуктов на другой. Если не задана строгая структура дерева, то такой маппинг невозможен.
 

skomoroh

Новичок
всем спасиба, сделал через SimpleXML, потом в рекурсивном цикле сравнил все элементы ...

но если кто-нить знает как это средствами xml-я сделать - напишите пожалста, интересно ...
 
Сверху