SAX парсер против XMLPull парсер

19

Я понимаю разницу между тем, как работает парсер SAX против анализатора XMLPull. На самом деле здесь есть довольно хорошее объяснение:

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm Статья немного ориентирована на .NET, но концепции применяются.

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

Спасибо.

Теги:
saxparser
xmlpullparser

7 ответов

16
Лучший ответ

Я нахожу, что они оба сосут. (И у меня есть лучшее решение)

Вы должны использовать XML-библиотеку с простой аннотацией. Я люблю его и использую его для всех моих проектов. Если вы читаете учебник, то я думаю, вы обнаружите, что он сможет делать все, что вы хотите, и намного быстрее и с меньшим количеством кода. (Таким образом, меньше подвержено ошибкам). Внутри библиотеки используются те парсеры, о которых вы просили сделать тяжелый подъем.

Если вы захотите, вы можете прочитать мой пост в блоге, включив его в проект Android. (Он будет работать в любой версии Android от почти до 1.5, что означает для всех в основном)

  • 0
    Спасибо, Роберт! Я прочитал это и мне действительно нравится это. Я сохраню свои комментарии к нему после того, как поиграю с ним еще
  • 0
    @Robert Роберт WTF Роберт :-) Ваш сайт, кажется, не работает!
Показать ещё 3 комментария
9

Это полностью зависит от ситуации, например: Если файл xml действительно большой, чем вы не можете выбрать парсер DOM, поскольку они сначала перенесли файл в память, а затем он будет разобран, и я обнаружил, что разбор файла для размера n требуется 7n памяти. В этом случае вы должны выбрать синтаксический анализатор SAX, и он будет потреблять меньше памяти.

Второй случай - когда файл не очень большой, в этом случае вы можете пойти для синтаксического анализа XML, потому что в этом вам будет полный контроль над xml, вы можете пропустить цикл синтаксического анализа в любом месте, где это невозможно в SAX. Итак, если тег, который вы ищете, является первым в файле, то зачем вам идти за целым файлом.

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

  • 2
    ссылка не работает ...
  • 0
    нет, это работает, я проверил это ...
Показать ещё 5 комментариев
2

Pull и Sax аналогичны тем, что они представляют собой низкоуровневые потоковые подходы, которые быстрее и эффективнее памяти, чем DOM, но pull имеет несколько преимуществ перед SAX:

Pull проще реализовать, чем SAX, потому что вам не нужно поддерживать состояние вашего синтаксического анализатора (используя дополнительные переменные, чтобы знать, в каком месте ваш парсер в настоящее время находится в дереве XML). Вложенные циклы в вашем коде анализатора более или менее соответствуют иерархии XML вашего документа, поэтому я думаю, что код Pull parser также более читабельен, чем код анализатора SAX.

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

Кроме того, вы можете реализовать парсер SAX с помощью парсинга pull. Противоположность невозможна.

По всем этим причинам я считаю, что анализатор pull превосходит SAX во всех ситуациях, однако, как SAX, это не тривиально для правильной реализации, и вы должны быть осторожны. Если вам не нужны низкоуровневые преимущества pull и SAX, а ваш XML чист, вы всегда можете использовать библиотеку синтаксического анализа более высокого уровня, например Simple, чтобы выполнить тяжелую работу для вас.

2

Оба синтаксических анализатора - это в основном одно и то же время памяти/времени. Единственное, что с помощью парсера pull вы можете вытащить события, такие как startelement и endelement, и только учитывать те, которые вы хотите.

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

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

1

Я считаю, что SAX-модель легче работать в одной конкретной ситуации: там, где вы собираетесь создать собственное представление в целом документа (или, по крайней мере, его основных) в памяти, с помощью настраиваемых структур данных. (Если вы не особенно относитесь к структуре данных, тогда парсер DOM уже делает это.)

0

Я нашел лучший и эффективный вывод при использовании SAX, а не XMLPullParser... Мой сценарий заключается в анализе атрибутов под тегом XML, я мог бы сделать это легко и вставить его в базу данных плавно... Я думаю, это зависит от ситуации, когда мне нужно писать в файле XML, я предпочитаю DOM Parser...

public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        currentElement = true;
        db = new DatabaseHelper(thecontext);
        if (qName.equals("Asa.Amms.Data.Entity.User")) {
            int length = attributes.getLength();
            for (int i = 0; i < length; i++) {
                String name = attributes.getQName(i);
                if (name.equals("Id")) {
                    id = Integer.parseInt(attributes.getValue(i));
                }
                if (name.equals("Login")) {
                    LoginID = attributes.getValue(i).toString();
                }
                if (name.equals("Name")) {
                    Name = attributes.getValue(i).toString();
                }
                if (name.equals("Password")) {
                    Password = attributes.getValue(i).toString();
                }
                if (name.equals("ProgramOfficerId")) {
                    user_ProgramOfficerId = Integer.parseInt(attributes.getValue(i).toString());
                }
            }
            Log.i("Baal dhukbe", id + LoginID + Name + Password);

            db.insertUser(id, LoginID, Name, Password, user_ProgramOfficerId);
        }
}
-1

Я бы рекомендовал использовать XmlPullParser один. Парсер Sax не получил тег из фида в моем тесте. xmlpullparser сделал это легко =) также зависит от ваших предпочтений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню