BLOG

Acompanhe a Mobits pelo RSS

FILTROS

28 Jul, 2010  20:43

Usando XML em seus projetos iPhone

Oi pessoal. Aqui na Mobits a gente trabalha bastante com parser de dados. As duas formas mais comuns são: XML e JSON. Hoje eu vou falar um pouco como usar XML em projetos iPhone. Em um post futuro, será sobre JSON.

Primeiros passos

Nos nossos projetos, utilizamos partes da Google Data APIs Objective-C Client Library que fornece diversas ferramentas de desenvolvimento para Mac e iPhone.

Para começar a trabalhar com XML em seu projeto, baixe o projeto completo do Google ou, para simplificar, somente o arquivo XML.zip onde selecionamos apenas os recursos necessários para este exemplo. Depois, siga os seguintes passos:

  1. Crie uma pasta XML na raiz do seu projeto e copie GDataDefines.h e a pasta XMLSupport para a pasta;

  2. No Xcode, adicione a pasta criada ao seu projeto;

  3. Adicione também libxml2.dylib à lista de Frameworks;

  4. Em Get Info do seu projeto, na aba Build, para todas as configurações, adicione em Header Search Paths:
    /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2 (Observe a versão do iOS no caminho acima. Pode ser necessário mudar de acordo com a versão utilizada pelo projeto.);

  5. Pronto. Agora você poderá usar o framework para fazer parser de XML.

Implementação

Agora que já temos o framework configurado em seu projeto, vamos usá-lo para fazer parser de um XML. Abaixo, um exemplo de XML:

<?xml version="1.0" encoding="utf-8"?>
<projetos>
    <projeto>
        <nome>Cine Mobits</nome>
        <descricao>Veja os horários do cinema direto do seu celular! Disponível para a maioria dos celulares com suporte a Java, iPhone/iPod Touch e também celulares com Android.</descricao>
    </projeto>
    <projeto>
        <nome>Mobits Button Soccer</nome>
        <descricao>O clássico futebol de botão, jogo presente na infância de muitas pessoas, agora em versão para iPhone/iPod Touch.</descricao>
    </projeto>
    <projeto>
        <nome>FaxGuru</nome>
        <descricao>Envie fax direto do seu iPhone! O FaxGuru permite que você tire fotos de documentos e envie-os via fax para mais de 250 países, além de ser simples, fácil de usar e totalmente em português.</descricao>
    </projeto>
</projetos>

A seguir, o código de parse:

#import "GDataDefines.h"
#import "Projeto.h"

@implementation ProjetosParser

+ (NSArray *)parse:(NSString *)xml {
    NSError *error = nil;

    NSXMLDocument *document = [[NSXMLDocument alloc] initWithXMLString:xml options:0 error:&error];
    NSXMLElement rootElement = [document rootElement];

    NSArray *projetosDoXML = [rootElement nodesForXPath:@"//projeto" error:&error];

    NSMutableArray *projetos = [NSMutableArray arrayWithCapacity:[projetosDoXML count]];

    for (NSXMLElement *projetoDoXML in projetosDoXML) {
        Projeto *projeto = [[Projeto alloc] init];
        projeto.nome = [[[projetoDoXML nodesForXPath:@"./nome/text()" error:nil] lastObject] stringValue];
        projeto.descricao = [[[projetoDoXML nodesForXPath:@"./descricao/text()" error:nil] lastObject] stringValue];

        [projetos addObject:projeto];
        [projeto release];
    }

    [document release];

    return projetos;
}

@end

A primeira coisa a ser feita é importar "GDataDefines.h". Se preferir, pode fazer a importação no pch e o parser ficará acessível para todas as classes do projeto.

Para começar a fazer o parse a partir de uma string XML, é preciso transformá-la em NSXMLDocument. Assim, conseguimos obter o elemento raiz do nosso XML. A partir daí, é só fazer as consultas XPath para obter as informações desejadas. No nosso exemplo, o método retorna um array de projetos.

Dica

Caso você se depare com um XML onde a raiz tem namespaces, a consulta XPath será da seguinte forma:

<projetos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">

projeto.nome = [[[projetoDoXML nodesForXPath:@"./*[local-name()=nome]/text()" error:nil] lastObject] stringValue];

Espero que este post seja útil! Como disse, o meu próximo assunto será sobre JSON. Aguardem!

COMPARTILHE

8 COMENTÁRIOs

  1. Fábio 29/07/2010, 14:36

    Bem interessante, principalmente a parte de adicionar parte do GData. Acho que há um pequeno erro na implementação, na linha

    projeto.nome = [[[grupoDoXML nodesForXPath:@"./nome/text()" error:nil] lastObject] stringValue];

    aparece esta variável, grupoDoXML que até então não foi definida. Subtitui por projetoDoXML (definida no for) e funcionou !!

    Gostaria de ver um tutorial sobre como usar o "Google Data APIs Objective-C Client Library" e aguardo o tutorial sobre como usar o JSON, preferencialmente com um projeto real, tipo, um cliente para o serviço Instapaper.com que possui uma API publica.

  2. Karin 29/07/2010, 15:53

    Olá Fábio, obrigada pelo toque. Já alterei o exemplo! []'s

  3. Tapajós 03/08/2010, 09:48

    Karin,

    Não sei se vocês conhecem o projeto http://iphoneonrails.com. Achei bem interessante sobretudo para a gente que gosta de desenvolver em Rails.

  4. Karin 03/08/2010, 14:19

    Tapajós, eu acho que esse comentário quem vai mais gostar é o Felipe :)

    Vamos dar uma olhada. Valeu pelo toque. []'s

  5. Quintana 03/08/2010, 15:05

    parece uma boa ideia mesmo esse projeto aí Tapa. Você já usou ele?

    Valew!

  6. William 27/04/2011, 10:45

    Olá, eu estou obtendo o seguinte erro, você poderia me dar uma luz no que está acontecendo?

    /Users/crescabrasil/Documents/uaXmlTeste/ProjetosParser.m:19:0 /Users/crescabrasil/Documents/uaXmlTeste/ProjetosParser.m:19: error: invalid initializer

    /Users/crescabrasil/Documents/uaXmlTeste/ProjetosParser.m:19:0 /Users/crescabrasil/Documents/uaXmlTeste/ProjetosParser.m:19: error: statically allocated instance of Objective-C class 'GDataXMLElement'

    /Users/crescabrasil/Documents/uaXmlTeste/ProjetosParser.m:19:0 /Users/crescabrasil/Documents/uaXmlTeste/ProjetosParser.m:19: error: statically allocated instance of Objective-C class 'GDataXMLElement'

  7. Karin 28/04/2011, 11:20

    Olá William,

    dando uma pesquisada rápida pelo seu erro, encontrei a seguinte referência: http://stackoverflow.com/questions/1063336/objective-c-class-initialization-errors.

    Tente isso! []'s

  8. William 28/04/2011, 15:26

    Vlw Karin, já encontrei onde estava o erro. faltava um * em rootElement se não me engano. =] Minha briga agora é outra, não consigo chegar no nó da consulta(RetornoConsultarCategorias) quando eu recebo o seguinte xml:

    <?xml version="1.0" encoding="utf-8"?> <soap:envelope> <soap:body> <consultarcategoriasresponse> <consultarcategoriasresult> <retornoconsultarcategorias> <id>int</id> <nome>string</nome> </retornoconsultarcategorias> </consultarcategoriasresult> </consultarcategoriasresponse> </soap:body> </soap:envelope>

    Só consegui quando retirei na "unha" os nós soap:Envelope,soap:Body e ConsultarCategoriasResponse. Desde já agradeço a atenção...

DEIXE UM COMENTÁRIO

If you can read this, you don't use a typical webbrowser that plays nice with CSS.
Please do not fill in anything here!