Разбор больших XML-файлов с использованием SAX-парсера (пропустите несколько строк / тегов) - PullRequest
7 голосов
/ 05 августа 2010

В настоящее время я занимаюсь разработкой приложения, которое извлекает данные из Интернета с использованием SAX. Я использовал его раньше для анализа простых XML-файлов, таких как Google Weather API. Тем не менее, сайты, которые меня интересуют, поднимают парсинг на новый уровень. Страница огромна и выглядит грязно. Мне нужно только получить некоторые конкретные строки; остальное для меня бесполезно.
Можно ли пропустить эти бесполезные строки / теги, или мне нужно идти шаг за шагом?

Ответы [ 7 ]

4 голосов
/ 05 августа 2010

Мне нравится обыкновенный дигестор. Это позволяет вам определять правила для определенных тегов. Правило исполняется только при обнаружении тега.

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

Я использую его для разбора всех моих файлов конфигурации.

Проверьте варочный котел на http://commons.apache.org/digester/

2 голосов
/ 05 августа 2010

Да, вы можете сделать это, просто игнорируйте теги, которые вам не интересны. Но учтите, что для этого придется проанализировать весь документ (DefaultHandler impl)

public startElement(String uri, String localName, 
     String qName, Attributes attributes)  {
  if(localName.equals("myInterestingTag") {
     // do your thing....
  }
}

public void endElement(String uri, String localName, String qName) {
  if(localName.equals("myInterestingTag") {
     // do your thing....
  }
}

public void characters(char[] ch, int start, int length) {
  // if parsing myinteresting tag... do some stuff.
}
1 голос
/ 05 августа 2010

См. Мой ответ на аналогичный вопрос о стратегии использования SAX для пропуска / игнорирования тегов:

Пропуск узлов с помощью sax

Это включает переключение ContentHandlers наXMLReader.Когда вы читаете портирование XML-документа, который хотите пропустить, вы просто переключаетесь в ContentHandler, который ничего не делает с событиями.Когда достигается конец игнорируемого раздела, он передает управление обратно обработчику содержимого, который вы использовали для обработки содержимого XML.

1 голос
/ 05 августа 2010

Вы можете попробовать комбинацию TagSoup для создания разбираемого XML-документа и XPath для получения интересных частей.

1 голос
/ 05 августа 2010

Если вы хотите прочитать определенные теги, то анализатор DOM намного быстрее, чем анализатор SAX. Анализатор SAX полезен, если вы хотите анализировать большие XML-файлы.

1 голос
/ 05 августа 2010

Вы можете попробовать использовать XPath, который будет использовать SAX за сценой для анализа вашего xml. Недостатком здесь является то, что XML будет анализироваться при каждом вызове метода оценки Xpath.

1 голос
/ 05 августа 2010

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

...