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 {Para fazer o download do projeto completo clique aqui.
//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);
}
}
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:
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.
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.
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
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
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