Есть ли более простой способ разбора XML в Java? - PullRequest
32 голосов
/ 12 ноября 2009

Я пытаюсь понять, как разобрать какой-то XML (для приложения Android), и кажется довольно смешным, насколько сложно это сделать в Java. Кажется, что это требует создания обработчика XML, который имеет различные обратные вызовы (startElement, endElement и т. Д.), И вам нужно позаботиться об изменении всех этих данных в объекты. Что-то вроде этого урока .

Все, что мне действительно нужно, - это преобразовать XML-документ в многомерный массив, а еще лучше иметь какой-нибудь процессор Hpricot . Есть ли способ сделать это, или мне действительно нужно написать весь дополнительный код в приведенном выше примере?

Ответы [ 14 ]

23 голосов
/ 12 ноября 2009

Существует два разных типа процессоров для XML в Java (на самом деле 3, но один странный). У вас есть парсер SAX, а вам нужен парсер DOM. Посмотрите на http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ как использовать синтаксический анализатор DOM. DOM создаст дерево, по которому можно довольно легко перемещаться. SAX лучше всего подходит для больших документов, но DOM намного проще, если медленнее и требует больше памяти.

13 голосов
/ 02 марта 2010

Попробуйте http://simple.sourceforge.net,. Это среда сериализации и привязки XML к Java, полностью совместимая с Android, очень легкая, 270 КБ и без зависимостей.

12 голосов
/ 12 ноября 2009

Проверьте эту статью для способов обработки XML на Android. Возможно, стиль DOM или XML Pull лучше подходит вашему стилю

Работа с XML на Android

3 голосов
/ 23 февраля 2011

Кайл

(Прошу прощения за саморекламу этого поста ... Я работаю над этой библиотекой несколько месяцев, и все это с открытым исходным кодом / Apache 2, так что не настолько корыстный, просто пытаюсь помочь).

Я только что выпустил библиотеку, которую я называю SJXP или "Простой Java XML Parser" http://www.thebuzzmedia.com/software/simple-java-xml-parser-sjxp/

Это очень маленький / плотный (4 класса) уровень абстракции, который располагается поверх любого совместимого со спецификацией XML Pull Parser.

На платформах Android и Java, не относящихся к Android, синтаксический разбор, вероятно, является одним из наиболее эффективных (как по скорости, так и с низким объемом памяти) методов синтаксического анализа. К сожалению, кодирование непосредственно с использованием разборщика-разбора в конечном итоге выглядит очень похоже на любой другой код синтаксического анализа XML (например, SAX) - у вас есть обработчики исключений, поддержание состояния синтаксического анализатора, проверка ошибок, обработка событий, анализ значений и т. Д.

То, что делает SJXP, позволяет вам определять XPath-подобные "пути" в документе элементов или атрибутов, значения которых вы хотите получить, например:

/ Новости / канал / название

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

Код для стандартного синтаксического анализатора будет выглядеть примерно так (пример, который анализирует заголовок канала RSS2):

IRule titleRule = new DefaultRule(Type.CHARACTER, "/rss/channel/title") {
@Override
public void handleParsedCharacters(XMLParser parser, String text) {
    // Store the title in a DB or something fancy
}}

затем вы просто создаете экземпляр XMLParser и задаете ему все правила, о которых вы хотите позаботиться:

XMLParser parser = new XMLParser(titleRule);
parser.parse(xmlStream);

И это все, парсер будет вызывать метод-обработчик каждый раз, когда правило соответствует. Вы можете прекратить анализ в любое время, вызвав parser.stop (), если хотите.

Кроме того (и это настоящая победа этой библиотеки), сопоставить квалифицированные элементы и атрибуты пространства имен очень просто, вы просто добавляете их URI пространства имен в скобках, добавляя префикс имени вашего пути.

В качестве примера, скажем, вы хотите исключить элемент для RSS-канала, чтобы вы могли сказать, на каком языке он находится (ref: http://web.resource.org/rss/1.0/modules/dc/). Вы просто используете уникальный URI пространства имен для этого элемента 'language' с Префикс 'dc', и путь к правилу выглядит примерно так:

/ Новости / канал / [http://purl.org/dc/elements/1.1/]language

То же самое относится и к атрибутам, квалифицированным для пространства имен.

При всей этой простоте единственные накладные расходы, которые вы добавляете в процесс синтаксического анализа, - это поиск хеша O (1) в каждом местоположении XML-документа и несколько сотен байт, возможно, 1 КБ, для внутреннего состояния синтаксического анализатора. .

Библиотека работает на Android без каких-либо дополнительных зависимостей (поскольку платформа уже обеспечивает использование org.xmlpull) и в любой другой среде выполнения Java, добавляя зависимость XPP3.

Эта библиотека является результатом многих месяцев написания пользовательских парсеров для каждого вида XML-фида на каждом языке и понимания (со временем), что около 90% синтаксического анализа может быть сведено к этой действительно базовой парадигме.

Надеюсь, вам это пригодится.

2 голосов
/ 12 ноября 2009

По-моему, вы должны использовать SAX-парсер, потому что: - Быстро - Вы можете контролировать все в XML-документе

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

Во втором случае вы редактируете только содержимое изменений.

Удачи!

2 голосов
/ 12 ноября 2009

Начиная с Java 5, в SDK есть библиотека XPath. См. этот урок для ознакомления с ним.

1 голос
/ 14 сентября 2015

Вы можете попробовать это
http://xml.jcabi.com/
Это дополнительный слой поверх DOM, который позволяет выполнять простой анализ, печать и преобразование документов и узлов XML

1 голос
/ 05 октября 2010

Я создал действительно простой API для решения именно этой проблемы. Это всего лишь один класс, который вы можете включить в свою базу кода, и он действительно чистый и простой для анализа любого XML. Вы можете найти его здесь:

http://argonrain.wordpress.com/2009/10/27/000/

1 голос
/ 05 марта 2010

На мой взгляд, использование XPath для синтаксического анализа XML может быть вашим самым простым подходом к кодированию. Вы можете воплотить логику для извлечения узлов из документа XML в одном выражении, вместо того, чтобы писать код для обхода графа объектов документа.

Я отмечаю, что еще один опубликованный ответ на этот вопрос уже предложил использовать XPath. Но пока не для вашего проекта Android . На данный момент класс синтаксического анализа XPath еще не поддерживается ни в одном выпуске Android (даже если пространство имен javax.xml определено в JVM Dalvik, что может обмануть вас, как это было сначала) .

Включение класса XPath в Android является текущим рабочим элементом на поздней стадии. (Он проверяется и отлаживается Google, когда я пишу это). Вы можете отслеживать статус добавления XPath к Davlik здесь : http://code.google.com/p/android/issues/detail?id=515

(Досадно, что вы не можете предположить, что вещи, поддерживаемые в большинстве виртуальных машин Java, включены в виртуальную машину Android Dalvik.)

Еще одна опция, ожидающая официальной поддержки Google, - это JDOM , которая в настоящее время заявляет о совместимости с Dalvik VM, а также о поддержке XPath (в бета-версии). (Я не проверял это; я просто повторяю текущие требования с их веб-сайта.)

0 голосов
/ 08 июня 2012

Очень хороший пример показывает XmlPullParser для любого типа xml. Это может также рассматриваться как общий способ, вам не нужно ничего менять, для этого просто получите этот класс и поместите в свой проект Android.

Общий XmlPullParser

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