2013-10-03 4 views
1

Мне нужно проанализировать относительно большие 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, заполните, пожалуйста, дополнительные комментарии.

ответ

1

Я не слишком много знаю о наборе инструментов XML, доступном для андроида, за исключением того, что он очень ограничен!

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

+0

Это похоже на то, что нет простого решения, и я должен буквально внедрить собственный синтаксический анализатор/сканер XML, и если я получил узел, мне нужно пропустить его, то я просто обойду до закрывающего тега для этого узла (правильно обработайте блоки «CDATA») ... – Budda

+0

Нет, не делай этого! Работа с потоком SAX может быть сложной задачей, но если вы попытаетесь написать свой собственный синтаксический анализатор, вы получите это неправильно, и люди будут вас ненавидеть. –

+0

SAX поток, который на самом деле тот же, что предлагает XmlPullParser. Проблема заключается в том, что я получаю слишком много событий для избыточных узлов содержимого HTML, которые часто являются содержимым узла XML. Я хотел бы избежать получения обратных вызовов для таких тегов ... – Budda

Смежные вопросы