Могут ли SAX Parsers использовать XPath в Java?

Я пытаюсь перенести один из моих classов, который использует синтаксический анализ DOM с большим количеством выражений XPath для синтаксического анализа SAX . DOM Parsing был хорош для меня, но некоторые из файлов, которые я пытаюсь разобрать, слишком велики, и они вызывают таймауты сервера. Я хочу повторно использовать 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"); 

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

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

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

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

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

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

  • Как получить пространства имен в файлах XML с помощью Xpath
  • Как определить повторяющиеся значения в числовой последовательности с помощью XPath 2.0?
  • Получение атрибута с использованием XPath
  • Оператор XPath OR для разных узлов
  • Как вы найдете все узлы между двумя H3, используя XPATH?
  • XPath - получить узел без дочернего элемента определенного типа
  • как отключить dtd во время выполнения в xpath java?
  • Почему нужно предпочитать использование CSS поверх XPath в IE?
  • Как передать параметр переменной в выражение XPath?
  • Есть ли какой-либо процессор XPath для SAX-модели?
  • Создать / получить xpath из узла XML java
  • Давайте будем гением компьютера.