KXML: Framework Java para Parser de XMLs

11 junho 2009

KXML
é um framework que implementa a API XmlPull. Esta é uma API simples utilizada para simplificar e otimizar o acesso, parse (análise de palavras) e exibição de XMLs e é designada para ambientes restritos, como os definidos para J2ME e também para alguns servidores usados em aplicações J2EE.

O KXML pode utilizar algumas técnicas para realizar o parse de um XML, como o “pull parser”, o DOM e o “push parser”. No “pull parser” uma quantidade de dados é analisada de cada vez, durante o parse sempre é solicitado a próxima parte que deve ser processada até chegar ao fim, geralmente isto é feito em um loop. Assim são obtidas as informações do XML a medida que o parser é efetuado. Uma outra técnica é o DOM, que utiliza um modelo baseado em árvore e cria uma estrutura de dados na memória, onde é possível acessar essa estrutura através de um conjunto de objetos. É muito simples de se utilizar, porém é necessário ler o documento inteiro para montar a estrutura de árvore, para depois exibir as informações que foram lidas, além disso, pode ter muitos objetos armazenados na memória então não é recomendado para ser usado em J2ME. E o modelo “push parser” é orientado a eventos, portanto ao ler um XML um objeto “listener” é notificado sempre que novas tags são encontradas.

Principais operações do KXML:
nextTag(): aponta para o próximo início ou fim de tag, pulando eventos insignificantes como espaços em braços ou comentários.

Require(): obriga o cursor a ser posicionado onde for indicado.

nextText(): exige que a posição corrente seja uma tag de início. Retorna o texto contido no elemento correspondente.

getName(): obtêm o nome da tag na posição corrente.

Veja agora um exemplo prático com a utilização da técnica pull parser. Vamos listar os dados de uma agenda, os quais são lidos de um XML.

Para entender como é construído um XML clique aqui.

Para baixar o KXML clique aqui.

Depois de baixado o .jar do KXML adicione ele nas Bibliotecas & Recursos do seu programa, que esta nas propriedades do projeto.

Obs: O projeto completo está disponível para download no final do pos.

O XML usado na nossa aplicação é este:


Vamos fazer o parse do XML assim que iniciar a aplicação, portanto no starMIDlet() coloque o seguinte código:
public void startMIDlet() {                           
/* A operação getResourceAsStream(String nome) encontra
* um recurso com o nome informado. Portanto no InputStream
* está o XML pessoas.*/
InputStream in = getClass().getResourceAsStream("pessoas.xml");

try{
switchDisplayable(null, getPessoas());
/*chama a função que vai fazer o parse do XML contido no InputStream in.*/
parser(in);
}catch(Exception e){
e.printStackTrace();
}
}

A função parser(in) é a seguinte:

public void parser(InputStream in) throws Exception{
//Inicia o XMLParser

//instância da classe KXmlParser
KXmlParser parser = new KXmlParser();

//seta como entrada do parser o InPutStreamReader in que contem o XML para a leitura
parser.setInput(new InputStreamReader(in));

//Posiciona na tag agenda
parser.nextTag();

//posiciona o parser na tag desejada, neste caso: agenda.

parser.require(XmlPullParser.START_TAG, null, "agenda");

//Enquanto é diferente do final da tag
while (parser.nextTag () != XmlPullParser.END_TAG){
//Posiciona na tag pessoa
parser.require(XmlPullParser.START_TAG, null, "pessoa");

/*para cada pessoa encontrada é chamado o método
parserPessoa para ler os seus elementos.*/

parserPessoa(parser);

pessoas.append("\n");
//posiciona no final da tag pessoa
parser.require(XmlPullParser.END_TAG, null, "pessoa");
}
//posiciona no final da tag agenda
parser.require(XmlPullParser.END_TAG, null, "agenda");
}

private void parserPessoa(KXmlParser parser) throws Exception {
//Enquanto é diferente de
while (parser.nextTag() != XmlPullParser.END_TAG) {
/*Posiciona no inicio de uma tag que esteja dentro da tag pessoa,
* não importando quais os nomes das tags. Ex: nome ou fone */
parser.require(XmlPullParser.START_TAG, null, null);

//obtem o nome da tag
String name = parser.getName();

//obtem o texto da tag
String text = parser.nextText();
System.out.println("Tag: " + name + " -> " + text);

/*Adiciona o texto no Form(celular) (O nome da tag não importa pra
* aplicação, portanto só exibimos o texto no form) */
pessoas.append(text);
//Posiciona no fim da tag fone ou nome
parser.require(XmlPullParser.END_TAG, null, name);
}
}
Para fazer o download do projeto completo clique aqui.

E é isto! Este é o exemplo de uma aplicação usando o KXML, que facilita muito a vida dos programadores! Espero que tenha sido útil!

Att, java móvel

5 comentários:

  • Unknown

    Este projeto é eclipse ou netbeans?
    Tentei utilizar kxml no eclipse incluindo no build path a lib, mas quando vou executar o Midlet ele da o seguinte erro :


    Running with storage root C:\Documents and Settings\daniel\j2mewtk\2.5.2\appdb\DefaultColorPhone
    Running with locale: Portuguese_Brazil.1252
    Running in the identified_third_party security domain
    java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserException
    at br.furb.furbot.mobile.MundoVisual.iniciarSequencia(+0)
    at br.furb.furbot.mobile.MundoVisual.iniciarSequencia(+6)
    at br.furb.furbot.mobile.exercicios.Teste.startApp(+37)


    Tens idéia do que pode ser? Um amigo me falou que o eclipse não gera o manifest correto com a referencia da KXML.

  • javamovel.com

    Olá Dani!
    O projeto é do netbeans...
    Se tiver dificuldade em importar o projeto para o uso, corrija o caminho do jar kxml e verifique o emulador, pois pode ser diferente.

    Ou então você pode usar as classes na IDE de sua preferência e adicionar o jar do kxml nas referências/bibliotecas.

    Caso não de certo entre em contato novamente.

  • Daniel Severo Estrázulas

    Olá Sr JavaMovel, resolvi o problema e como acredito que MUUUITA GENTE teve o mesmo problema aqui está a solução:
    Passo 1:
    Eclipse -> "Project Properties" -> Java Build Path -> Add Jar (procurar .jar da KXML).
    Passo 2:
    Na mesma tela acima, ira na aba Order and Export , é necessário Checkar a lib kxml2-xxxx.jar , assim o eclipse inclui no JAR a lib do KXML e na hora de rodar ele consegue achar os .class das libs externas.

    Muito obrigado pela ajuda mesmo assim.

    Abraços

  • Daniel Severo Estrázulas

    Por curiosidade eu baixei o net beans , criei um novo projeto e importei os seus fontes do exemplo da KXML, adicionei nos recursos a lib também, tudo perfeito, ele até abre o emulador e não aparece nada , somente diz Select one to launch.

    Vc Sabe o que pode ser?

    Abraços

  • javamovel.com

    Olá Daniel! Que bom que resolveu o problema, nada que não seja possível quando se persiste ;)

    Olha, abri o projeto do netbeans que está disponível pra download aí e só precisou trocar o emulador, pois o projeto referente usa o WTK e aqui na máquina está instalado o Java ME SDK 3.0. Creio que o erro esteja no uso da IDE.

    []´s

  • Postar um comentário