У меня есть XML-файл объемом более 100 МБ (sans-DTD / Schema). У XSLT этого не будет. Стратегии преобразования / разбора? - PullRequest
1 голос
/ 29 сентября 2008

Этот XML-файл содержал архивированные новости за весь прошлый год. Меня попросили отсортировать эти истории по категориям [y | ies] в новые XML-файлы.

big_story_export.xml

превращается в

lifestyles.xml
food.xml
nascar.xml

... и т. Д.

Я выполнил работу с помощью одноразового скрипта Python, однако , Я изначально пытался сделать это с помощью XSLT . Это привело к разочарованию, так как мои выборы XPATH ломали кровать. Тестовые файлы были преобразованы идеально, но сопоставление большого файла с моей таблицей стилей привело к ... ничему .

Какие стратегии вы рекомендуете для обеспечения того, чтобы такие файлы запускались через XSLT? Это было передано мне продавцом, так что представьте, что у меня нет большого рычага, когда дело доходит до определения структуры этого файла.

Если вам, ребята, нужны примеры кода, я соберу их вместе.

Во всяком случае, я был бы доволен некоторыми советами, как сделать так, чтобы XML + XSLT слаженно работали вместе.


@ Sklivvz

Я использовал python для libxml2 & libxslt, чтобы обработать это. Я смотрю в xsltproc сейчас.

Кажется, это хороший инструмент для этих разовых ситуаций. Спасибо!


@ Diomidis-Спинеллис

Он хорошо сформирован, хотя (как уже упоминалось) у меня нет способностей обнаружить его обоснованность.

Что касается написания схемы, мне нравится идея.

Время, потраченное на проверку этого одного файла, было бы нецелесообразным, если бы оно было единоразовым, хотя я и предвидел необходимость обрабатывать такие файлы от нашего поставщика.

Написание схемы (и передача ее поставщику) было бы отличной долгосрочной стратегией для управления такими фанками XML. Спасибо!

Ответы [ 5 ]

6 голосов
/ 30 сентября 2008

Проблема с использованием XSLT для обработки произвольно больших документов XML заключается в том, что обработка XSLT начинается с анализа входного документа в исходном дереве. Это дерево анализируется в памяти. Это означает, что в конечном итоге вы встретите входной документ, достаточно большой, чтобы вызвать проблемы, даже если вы используете надежный процессор XSLT, такой как Saxon, и у вас достаточно виртуальной памяти. (Это может все еще работать, но это будет медленно.)

Другая причина не использовать XSLT для этого заключается в том, что вы создаете несколько выходных документов, что (основываясь на том, что вы сказали до сих пор) означает, что вы делаете несколько проходов над входным документом.

Может быть (в зависимости от многих факторов о вашей ситуации, о которых я не знаю), лучше использовать подход, основанный на SAX, вместо использования XSLT. Используя процессор SAX, вы можете написать метод, который делает одну прямую передачу через исходный документ, анализирует его по ходу и записывает все выходные документы при обнаружении элементов, которые их содержат.

3 голосов
/ 29 сентября 2008

Это звучит как ошибка в большом XML-файле или процессоре XSLT. Есть две вещи, которые вы должны проверить в своем файле.

  1. Является ли файл правильно сформированным XML? То есть все ли теги и атрибуты правильно завершены и сопоставлены? XML-процессор, такой как xmlstarlet , может сказать вам это.
  2. Содержит ли файл допустимый XML? Для этого вам понадобится схема и валидатор XML ( xmlstarlet также может выполнить этот трюк). Я предлагаю вам приложить некоторые усилия, чтобы написать определение схемы вашего файла. Это значительно упростит вашу отладку, потому что вы можете легко определить точный источник проблем, которые могут у вас возникнуть.

Если файл правильно сформирован и действителен, но процессор XSLT по-прежнему отказывается дать вам ожидаемые результаты, вы можете быть уверены, что проблема в процессоре, и вам следует попробовать другой. *

2 голосов
/ 29 сентября 2008

Могу ли я порекомендовать процессор Saxon XSLT - я точно знаю, что он может обрабатывать большие файлы, если вы предоставите Java JVM достаточно памяти.

Другое дело, что в вашем XSLT могут быть оптимизации, которые могут помочь, но сложно сделать общие заявления о подобных вещах.

2 голосов
/ 29 сентября 2008

Какой язык / парсер вы использовали?
Для больших файлов я пытаюсь использовать инструменты командной строки Unix.
Они, как правило, намного, намного эффективнее других решений и не «наполняются» большими файлами.

Попробуйте использовать xsltproc

0 голосов
/ 24 октября 2008

Проверьте Apache Xalan C ++ . По моему опыту, когда другие (включая Saxon) не работали с «большими» XML-файлами (> 600 МБ), он мог работать с памятью, чтобы сэкономить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...