#android #xml #saxparser #xmlpullparser
#Android #xml #saxparser #xmlpullparser
Вопрос:
Я понимаю разницу между тем, как работает анализатор SAX и синтаксический анализатор XmlPull. На самом деле здесь есть довольно хорошее объяснение:
http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm Статья немного.Ориентирован на СЕТЬ, но концепции применимы.
Хотя я согласен с мнением автора о том, что с Pull parser проще работать, я довольно смущен тем, какой тип парсера был бы лучше в каких ситуациях. Если кто-нибудь может пролить свет и указать мне на некоторые дополнительные чтения, я был бы признателен.
Спасибо.
Ответ №1:
Я считаю, что они оба отстой. (И у меня есть лучшее решение, которое я могу предложить)
Вы должны использовать простую библиотеку XML на основе аннотаций. Мне это нравится, и я использую его для всех своих проектов. Если вы прочтете руководство, то, я думаю, вы обнаружите, что оно сможет делать все, что вы хотите, намного быстрее и с меньшим количеством кода. (Таким образом, он менее подвержен ошибкам) Внутри библиотеки используются те анализаторы, о которых вы спрашивали, для выполнения тяжелой работы.
Затем вы можете прочитать мой пост в блоге о включении его в проект Android, если хотите. (Это будет работать в каждой версии Android, по крайней мере, от 1.5, что означает, что в основном для всех)
Комментарии:
1. Спасибо, Роберт! Я прочитал это, и мне это тоже очень нравится. Я сохраню свои комментарии к нему после того, как поиграю с ним еще немного
2. @Robert WTF Роберт 🙂 Похоже, ваш сайт не работает!
3. @dbm: Я очень сожалею об этом. Мне пришлось перенести свой блог с одного домена на другой, и по-прежнему повсюду валяются ошибочные ссылки, и это была одна из них. Я отредактировал этот пост и вставил ссылку на то, куда переместился блог. Спасибо, что предупредили меня, и я надеюсь, что людям теперь понравятся новые сообщения. (Я разочарован, потому что предполагалось, что он все еще будет перенаправлять 301 на старый хост).
4. Однако SimpleXML не подходит для больших XML-файлов. Для этого используйте SAX .
5. Это Android, поэтому вы ограничены памятью и процессором. Итак, это реальные проблемы: поглощает ли он весь xml? Эффективен ли код?
Ответ №2:
Это полностью зависит от ситуации, например, если xml-файл действительно большой, вы не можете выбрать DOM-анализаторы, поскольку они сначала перенесут файл в память, а затем он будет проанализирован, и я обнаружил, что для синтаксического анализа файла размера n требуется 7n места в памяти. В этом случае вам следует выбрать синтаксический анализатор SAX, он легкий и будет потреблять меньше памяти.
Второй случай, когда файл не очень большой, в этом случае вы можете использовать XML pull parser, потому что в этом случае у вас будет полный контроль над xml. Вы можете пропустить цикл синтаксического анализа в любом случае, когда это невозможно в SAX. Итак, если тег, который вы ищете, является первым в файле, тогда зачем вам использовать весь файл.
Итак, насколько я знаю, если вы рассматриваете только скорость работы с небольшим файлом, используйте XML pull parser, а если файл большой, и вы хотите разобрать все это, тогда используйте SAX.
Комментарии:
1. ну, вчера он барахлил, возможно, это было на стороне сервера
2. Извините, ребята, за поздний ответ, но да, эта ссылка не работает. Я свяжусь с вами как можно скорее с лучшим ответом.
3. Ссылка была разорвана, поэтому я написал свое понимание, пожалуйста, обновите, если чего-то не хватает
Ответ №3:
Оба анализатора в основном одинаковы по объему памяти и времени. Единственное, что с помощью pull parser вы можете извлекать события, такие как startelement и endelement, и учитывать только те, которые вы хотите.
здесь, как и в парсерах Android sax, у вас нет выбора, вы просто помещаете код туда, куда хотите, но вы должны включить все события.
вот ссылка, на которую вы можете перейти для дальнейшего чтения.
Ответ №4:
Я считаю, что с моделью SAX проще работать в одной конкретной ситуации: когда вы собираетесь создать собственное представление всего документа (или, по крайней мере, его основных частей) в памяти с пользовательскими структурами данных. (Если вы не разбираетесь в структуре данных, то анализатор DOM уже делает это.)
Ответ №5:
Pull и Sax похожи в том смысле, что оба они являются низкоуровневыми потоковыми подходами, которые быстрее и эффективнее с точки зрения памяти, чем DOM, но у pull есть несколько преимуществ перед SAX:
Pull проще реализовать, чем SAX, потому что вам не нужно поддерживать состояние вашего анализатора (используя дополнительные переменные, чтобы иметь возможность знать, в каком месте вашего анализатора в настоящее время находится в XML-дереве). Вложенные циклы в вашем коде pull parser будут более или менее соответствовать иерархии XML вашего документа, поэтому я думаю, что код Pull parser также более удобочитаем, чем код SAX parser.
С помощью кода pull parser вы можете пропускать целые блоки, которые вы не хотите анализировать, поэтому он также более эффективен, чем SAX, который всегда извлекает основную информацию обо всех узлах. Используя pull parser, вы также можете остановить синтаксический анализ в любой момент, если вы извлекли нужную информацию, что невозможно с SAX.
Кроме того, вы можете реализовать синтаксический анализатор SAX с помощью pull parser. Обратное невозможно.
По всем этим причинам я считаю, что pull parser превосходит SAX во всех ситуациях, однако, как и SAX, его нетривиально реализовать должным образом, и вы должны быть осторожны. Если вам не нужны преимущества низкоуровневой скорости pull и SAX и ваш XML чистый, вы всегда можете использовать библиотеку синтаксического анализа более высокого уровня, такую как Simple, чтобы выполнить тяжелую работу за вас.
Ответ №6:
Я нашел лучший и более эффективный вывод при использовании 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);
}
}
Ответ №7:
я бы рекомендовал использовать XmlPullParser.. анализатор Sax не извлек тег из канала в моем тесте .. xmlpullparser сделал это легко =) также зависит от ваших предпочтений