Мне нужно проанализировать относительно большие XML-файлы на Android.Как ограничить область действия для XPath
Некоторая внутренняя структура узла содержит HTML-теги, для некоторых других узлов мне нужно извлекать контент с разных уровней глубины. Поэтому, вместо того, чтобы использовать XmlPullParser я планирую:
- с помощью XPath, найти правильный узел
- с помощью «getElementsByTagName» найти соответствующий подраздел узел (ы)
- извлекать информацию и сохранить ее в моем пользовательских данных объекты.
Проблема у меня есть производительность. Способ, как открыть файл выглядит следующим образом:
File file = new File(_path);
FileInputStream is = new FileInputStream(file);
XPath xPath = XPathFactory.newInstance().newXPath();
NamespaceContext context = new NamespaceContextMap("def", __URL__);
xPath.setNamespaceContext(context);
Object objs = xPath.evaluate("/def:ROOT_ELEMENT/*,
new InputSource(is), XPathConstants.NODESET);
Даже если мне нужно, чтобы получить несколько строк, которые находятся в самом начале файла XML, он выглядит как XPath разбирает весь файл XML и поместить его в структуре DOM.
В некоторых случаях мне нужен доступ к полному объекту, и нормально работать с несколькими секундами для нескольких мегабайтных файлов.
В других случаях - мне нужно только получить несколько узлов и не хотеть, чтобы пользователи дождались, когда моя программа выполнит избыточный синтаксический анализ.
Q1: Каким образом можно получить некоторые части файла XML без его полного разбора?
Q2: Есть ли способ ограничить XPath от сканирования/разбора WHOLE XML-файла? Например: сканирование до 2-го уровня глубины?
спасибо.
P.S. В одном конкретном случае XML-файл представляет собой формат файла FB2, и если у вас есть какие-то конкретные советы, которые могут решить мою проблему для разбора файлов fb2, заполните, пожалуйста, дополнительные комментарии.
Это похоже на то, что нет простого решения, и я должен буквально внедрить собственный синтаксический анализатор/сканер XML, и если я получил узел, мне нужно пропустить его, то я просто обойду до закрывающего тега для этого узла (правильно обработайте блоки «CDATA») ... – Budda
Нет, не делай этого! Работа с потоком SAX может быть сложной задачей, но если вы попытаетесь написать свой собственный синтаксический анализатор, вы получите это неправильно, и люди будут вас ненавидеть. –
SAX поток, который на самом деле тот же, что предлагает XmlPullParser. Проблема заключается в том, что я получаю слишком много событий для избыточных узлов содержимого HTML, которые часто являются содержимым узла XML. Я хотел бы избежать получения обратных вызовов для таких тегов ... – Budda