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

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

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

Ответы [ 14 ]

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

Пару недель назад я разбил небольшую библиотеку (оболочку около 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"));
0 голосов
/ 12 ноября 2009

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

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

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

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

Хорошо разбирать XML - задача не из легких.

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

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

Задачи синтаксического анализа XML обычно делятся на три категории.

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

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

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

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