Кайл
(Прошу прощения за саморекламу этого поста ... Я работаю над этой библиотекой несколько месяцев, и все это с открытым исходным кодом / 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% синтаксического анализа может быть сведено к этой действительно базовой парадигме.
Надеюсь, вам это пригодится.