Могут ли парсеры SAX использовать XPath в Java? - PullRequest
5 голосов
/ 09 января 2012

Я пытаюсь перевести один из моих классов, который использует синтаксический анализ DOM с большим количеством выражений XPath, на анализ SAX. DOM Парсинг мне понравился, но некоторые файлы, которые я пытаюсь проанализировать, слишком велики и вызывают тайм-ауты сервера. Я хочу повторно использовать XPath с парсингом SAX, но я не уверен, если это возможно, и если это невозможно, не могли бы вы помочь мне, потому что я понятия не имею, каким будет следующий код, когда я использую только SAX:

Document doc = bpsXml.getDocument();
String supplierName = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/Party[@stdValue='SU']/Name/Name1");
String language = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue");

Ответы [ 3 ]

4 голосов
/ 09 января 2012

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

Поскольку у вас не будет дерева в памяти, вы не сможетеиспользуйте XPath.Вы можете проверить только текущий «контекст» (ваш управляемый стек, управляемый вручную) для запроса вашего документа. Помните, что парсер SAX выполнит только один запуск для вашего файла, поэтому порядок в файле важен.

К счастьюЕсть другой подход, например VTD-XML , который представляет собой библиотеку, которая строит дерево XML в памяти, но только часть структуры, она не извлекает фактическое содержимое из файла, содержимое извлекается какнеобходимо.Он намного эффективнее по памяти, чем DOM-парсер, но при этом разрешает XPath.Я лично использую эту библиотеку на работе, чтобы проанализировать ~ 700 МБ XML-файлов с XPath (да, это безумие, но это работает, и это очень быстро.)

1 голос
/ 09 января 2012

ИМХО самый простой способ обработки XML - использовать StAX , потоковый API для XML. Он сочетает в себе преимущества DOM и SAX (и предлагает вам более легкую миграцию). У вас все еще есть курсор на элемент XML (как в SAX), но ваш код перемещает курсор вперед. Это дает большое преимущество, поскольку код обработки XML становится намного более читабельным. Это также решает проблему с памятью, поскольку в памяти должен храниться только текущий элемент XML. Вот также хороший учебник .

Также чтобы ответить на ваш первоначальный вопрос: короткий поиск в Google показал мне, что нет простого, общепринятого способа, который, вероятно, означает, что все нестандартные решения не являются надежными, не обслуживаются и не проверены.

0 голосов
/ 09 января 2012

Переключение на SAX-разбор (или StAX) потребует полного изменения вашего подхода. Выглядит так, как будто вы еще не до конца оценили объем работы. Чтобы любой совет имел смысл, нам нужно знать, насколько велик файл, и какую обработку вы хотите выполнить с данными. Например, если вы фильтруете данные, то реализация XQuery, использующая проекцию документа, может быть хорошим ответом (при этом автоматически будет использоваться SAX за кулисами для построения дерева, содержащего только подмножество данных, которые вас действительно интересуют) .

...