Intereting Posts
Как преобразовать изображение в строку Base64? Не удается установить версию отладки и выпуска на том же устройстве Как изменить пробелы для подчеркивания и сделать строковый регистр нечувствительным? Как фильтровать RecyclerView с помощью SearchView Класс не найден, но класс определенно существует Удаление записи с помощью ProGuard не удаляет строки, которые записываются в журнал Можете ли вы восстановить удаленные модули .iml-файл в андроид-студии Часы Emulator не соответствуют часам системы хоста Никаких ограничений грамматики (DTD или XML-схемы), обнаруженных для документа (Android) Как изменить цвет указателя EditText (не курсор) Не удалось создать Jenkins из-за отсутствия SDK для Android. Рисование программно овальной формы с границей (угловой радиус) на Android Gradle для Android, AAR и условные зависимости Непредвиденная ошибка при анализе ввода недопустимого файла иерархии uiautomator Как программно перемещать, копировать и удалять файлы и каталоги на SD?

Есть ли более простой способ анализа XML в Java?

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

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

Solutions Collecting From Web of "Есть ли более простой способ анализа XML в Java?"

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

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

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

Работа с XML на Android

Кайл,

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

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

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

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

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

/ RSS / канал / название

И он вызовет ваш обратный вызов со значением, когда это правило будет соответствовать. 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-канала, чтобы вы могли узнать, на каком языке он находится (ссылка: http://web.resource.org/rss/1.0/modules/dc/ ). Вы просто используете уникальный URI пространства имен для этого элемента «language» с префиксом «dc», и путь к правилам выглядит следующим образом:

/rss/channel/[http://purl.org/dc/elements/1.1/]language

То же самое можно сказать и о атрибутах, связанных с пространством имен.

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

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

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

Надеюсь, вам это удобно.

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

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

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

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

Удачи!

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

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

Вы также можете использовать Castor для сопоставления компонентов XML с Java. Я использовал его раньше, и он работает как шарм.

Написание SAX handler – лучший способ. И как только вы это сделаете, вы никогда не вернетесь ни к чему другому. Это быстро, просто, и он хрустит, когда он идет, не сосать большие части или бог запретить целое DOM в память.

Пару недель назад я избил небольшую библиотеку (обертка вокруг javax.xml.stream.XMLEventReader ), позволяющую анализировать XML аналогично ручному рекурсивному парсеру спуска. Источник доступен на github , а ниже приведен простой пример использования. К сожалению, Android не поддерживает этот API, но он очень похож на API XmlPullParser , который поддерживается, и перенос не будет слишком трудоемким.

 accept("tilesets"); while (atTag("tileset")) { String filename = attrib("file"); File tilesetFile = new File(filename); if (!tilesetFile.isAbsolute()) { tilesetFile = new File(FilenameUtils.concat(file.getParent(), filename)); } int tilesize = Integer.valueOf(attrib("tilesize")); Tileset t = new Tileset(tilesetFile, tilesize); t.setID(attrib("id")); tilesets.add(t); accept(); close(); } close(); expect("map"); int width = Integer.valueOf(attrib("width")); int height = Integer.valueOf(attrib("height")); int tilesize = Integer.valueOf(attrib("tilesize")); 

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

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

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

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

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

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

Общий XmlPullParser

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

Ну, разбор XML – это непростая задача.

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

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

Задачи синтаксического анализа XML, как правило, попадают в три категории.

Вещи, которые можно сделать с помощью «регулярного выражения». Например, вы хотите найти значение первого тега «MailTo» и не заинтересованы в содержимом любых других тегов.

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

Все остальные! Несмотря на то, что формат сообщения xml может выглядеть обманчиво, простые домашние парсеры легко смешиваются с дополнительными атрибутами, CDATA и неожиданными детьми. Полноразмерные анализаторы XML могут обрабатывать все эти ситуации. Здесь основной выбор между потоком или парсером DOM. Если вы намерены использовать большинство сущностей / атрибутов, заданных в том порядке, в котором вы хотите их использовать, тогда парсер DOM идеален. Если вас интересуют только некоторые атрибуты и намереваются использовать их в том порядке, в котором они представлены, если у вас есть ограничения производительности, или, если файлы xml большие (> 500 МБ), чем способ анализа потока; Механизм обратного вызова принимает немного «groking», но его на самом деле довольно просто программировать, как только вы получите его.