SAX парсер против XMLPull парсер - PullRequest
19 голосов
/ 27 апреля 2011

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

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm Эта статья немного ориентирована на .NET, но концепции применимы.С парсером легче работать, я не совсем понимаю, какой тип парсера будет лучше в каких ситуациях.Если бы кто-нибудь мог пролить свет и указать мне еще на чтение, я был бы признателен.

Спасибо.

Ответы [ 7 ]

16 голосов
/ 28 апреля 2011

Я считаю, что они оба отстой.(И у меня есть лучшее решение, чтобы предложить)

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

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

9 голосов
/ 14 июля 2011

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

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

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

2 голосов
/ 03 мая 2014

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

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

Также вы можете реализовать SAX-анализатор с использованием pull-анализатора.Противоположность невозможна.

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

2 голосов
/ 27 апреля 2011

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

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

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

1 голос
/ 27 апреля 2011

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

0 голосов
/ 14 июня 2015

Я нашел лучший и более эффективный вывод при использовании 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);
        }
}
0 голосов
/ 05 мая 2011

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

...