Всем кто читает привет!
В последний раз мы говорили о программировании баз данных под андроид в связи с нашим клиентом для блога. Сегодня поговорим о загрузке файлов и о парсинге XML.
Итак, мы с вами уже реализовали серверную часть которая в зависимости от передаваемых ей в URL параметров возвращает нам либо некий xml файлик, либо html страничку с определенным постом из базы данных. Теперь давайте научимся разбирать этот xml файлик (запихивать его содержимое в базу мы слава Ктулху уже умеем).
Сегодня пойдем дельше и попробуем разобрать (распарсить) полученный от сервера xml файл. Вообще надо заметить, что в java вообще и в Android в частности существует два варанта для работы с XML. Первый вариант — это DOM (Document Object Model). Он предполагает загрузку в память всего XML файла, и затем мы можем перемещаться по файлу, получать информацию о узлах и контенте, который в нем хранится. Второй вариант — SAX (Simple API for XML) — это событийно-ориентированный парсер. На вход такого парсера подается некий XML файл и затем мы обрабатваем те или иные события возникающие в ходе чтения этого файла парсером. Событиями могут быть, например, новый открывающий тег, новый закрывающий тег, и т.д. Именно такой подход мы и будем использовать, как наименее ресурсоемкий.
Для реализации такого парсера нам требуется создать класс, наследующий у класса org.xml.sax.helpers.DefaultHandler. У этого класса есть целая куча методов которые мы можем переопрелелить. Например startDocument() — вызываемый при начале документа endDocument() — вызываемый когда парсер доходит до конца документа, startElement() — обрабатывает начало нового тега, endElement() — обрабатывает закрывающий тег и так далее. Подробнее вы можете посмотреть здесь. нам с вами необходимо использовать только два из них. Итак вот код класса:
package ru.davidmd.zabavareader;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ParserHandler extends DefaultHandler {
dbExtender db;
ParserHandler(dbExtender db) {
this.db = db;
}
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
if (localName.toLowerCase().equals("header")) {
String title = atts.getValue("title");
String content = atts.getValue("content");
String date = atts.getValue("date");
int id = Integer.parseInt(atts.getValue("id"));
String guid = atts.getValue("guid");
db.addpost(title, content, date, id, guid);
}
}
@Override
public void endDocument() {
try {
super.endDocument();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
А теперь давайте смотереть что мы здесь натворили. Во первых конструктор в который мы передаем ссылку на объект класса dbExtender из прошлого урока. Во вторых у нас имеется метод startElement() в котором мы обрабатываем элемент. Сначала мы проверяем если текущий тег имеет название «header» то затем получаем все атрибуты тега и записываем их в базу данных. Ну и в третьих я зачем-то переопределил метод endDocument() но честно говоря это абсолютно лишнее 🙂 и его можно смело отсюда выкинуть :).
Теперь когда мы вызовем парсер с нашим хендлером наши методы обработчики будут вызываться при соответствующих условиях.
На сегодня пожалуй хватит. Есть вопросы? Пишите в комментах!