(no subject)
Jun. 27th, 2007 09:37 pmПоскольку рабочий день у меня вдруг закончился, а делать больше ничего не хочется, то я еще побрюзжу на тему XML...
В системе (угадайте какой), структура системы при экспорте записывается в виде xml'я. вида
<types>
<type name="aaaa">
.....
</type>
<type name="bbbb">
......
</type>
</types>
Вороде бы хорошо и красиво. Работает, супер. Правда, когда оно писалось, libxml под перлом еще не было (первая версия XML::LibXML август 2001, а load_meta начал писаться в январе 2001) и оно мучительно читается через XML::Parser.
Это фиг бы с ним. Работает и ладно...
Но наступает момент, когда надо сравнить, правильно ли оная структура была загружена. Кажется все просто, загрузить, выгрузить, сравнить результаты...
И тут начинается...
diff'ом результатом не сравнишь, потому что порядок <type name="aaaa"> и <type name="bbbb"> никто не гарантирует, черт его знает, как оно из базы придет.
xmldiff тоже не катит, потому что он на все изменения порядка срабатывает...
XML::Diff, есть такой модуль, оказался наредкость сырой, и падал на пустых тегах <p></p>
Найти каких либо внятных средств которые бы умели нестрого сравнивать, мне так и не удалось...
В результате пришлось писать свою собственную приблуду сравнивающую деревья с определенными свойствами...
Вывод: бардак в общем виде скорее вреден, чем полезен.
Вот.
В системе (угадайте какой), структура системы при экспорте записывается в виде xml'я. вида
<types>
<type name="aaaa">
.....
</type>
<type name="bbbb">
......
</type>
</types>
Вороде бы хорошо и красиво. Работает, супер. Правда, когда оно писалось, libxml под перлом еще не было (первая версия XML::LibXML август 2001, а load_meta начал писаться в январе 2001) и оно мучительно читается через XML::Parser.
Это фиг бы с ним. Работает и ладно...
Но наступает момент, когда надо сравнить, правильно ли оная структура была загружена. Кажется все просто, загрузить, выгрузить, сравнить результаты...
И тут начинается...
diff'ом результатом не сравнишь, потому что порядок <type name="aaaa"> и <type name="bbbb"> никто не гарантирует, черт его знает, как оно из базы придет.
xmldiff тоже не катит, потому что он на все изменения порядка срабатывает...
XML::Diff, есть такой модуль, оказался наредкость сырой, и падал на пустых тегах <p></p>
Найти каких либо внятных средств которые бы умели нестрого сравнивать, мне так и не удалось...
В результате пришлось писать свою собственную приблуду сравнивающую деревья с определенными свойствами...
Вывод: бардак в общем виде скорее вреден, чем полезен.
Вот.
no subject
Date: 2007-06-27 07:34 pm (UTC)Как знатоку XML
Date: 2007-06-27 08:16 pm (UTC)Все плохо...
Date: 2007-06-28 07:40 am (UTC)==================
The XML::DOM code is fairly stable and has been used quite a bit.
However, there is a new DOM module, XML::GDOME which is under active
development and significantly faster than XML::DOM, since it is based on
the libgdome C library. It provides Level 2 of the DOM Core API. For
more details see http://tjmather.com/xml-gdome/
==================
Смотрим XML::GDOME: Написано "It uses a XS wrapper around the gdome2 library".
Смотрим http://gdome2.cs.unibo.it/: Там написано "Libgdome is based on libxml2."
При этом последняя версия XML::DOM от 25 Jul 2005, а XML::GDOME от 30 Mar 2004
И при этом я сам лично ловил на XML::DOM ошибку
Для текста
<body>
<p>Русский текст
<p>«English Text»
</body>
Если его загрузить и сохранить назад в utf-8, на выходе у меня получался невалидный уникод. Кавычки вместо уникодного кода были записаны в кодировке iso 8859-1
Может я конечно не приминил какой нибудь хак, который можно было бы применить... Но что-то я в XML::DOM после этого не верю.
Re: Как знатоку XML
Date: 2007-06-28 07:43 am (UTC)Да хрен его знает. С дуру можно и хрен сломать...
У меня например сравнитель работал секунд по N-цать пока я не оторвал скачку внешнего DTD из сети, при распарсивании, благо он не нужен. Тогда все стало летать...
Тут конкретно смотреть надо