Skip to main content

Como analisar arquivos XML no Xcode

Netsparker Web Application Security Scanner Product Tour - V4 (Abril 2025)

Netsparker Web Application Security Scanner Product Tour - V4 (Abril 2025)
Anonim

Uma tarefa simples que é o backbone de muitos aplicativos é a capacidade de analisar arquivos XML. E, felizmente, o Xcode torna relativamente fácil analisar um arquivo XML em Objective-C.

Um arquivo XML pode conter desde dados básicos sobre seu aplicativo até um feed RSS de um site. Eles também podem ser uma ótima maneira de atualizar as informações dentro do seu aplicativo remotamente, evitando assim a necessidade de enviar um novo binário para a Apple simplesmente para adicionar um novo item a uma lista.

Então, como processamos arquivos XML no Xcode? O processo contém etapas para inicializar as variáveis ​​a serem usadas, iniciando o processo do analisador XML, alimentando esse processo com um arquivo, o início de um elemento individual, os caracteres (valor) dentro do elemento, o final de um elemento individual e o final do processo de análise.

Neste exemplo, analisaremos um arquivo da Internet passando um determinado endereço da Web (URL).

Vamos começar com a construção do arquivo de cabeçalho. Este é um exemplo de um arquivo de cabeçalho muito básico para um Controlador de Visualização de Detalhes com os requisitos mínimos para analisar nosso arquivo:

@interface RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;Artigos NSMutableArray *;NSMutableDictionary * item;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property (nonatomic, reter) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;A função parseXMLFileAtURL iniciará o processo para nós. Quando terminar, os "artigos" NSMutableArray armazenarão nossos dados. A matriz será composta de dicionários mutáveis ​​com chaves relacionadas aos nomes de campos no arquivo XML.

Agora que configuramos as variáveis ​​necessárias, passaremos para o encontro do processo no arquivo .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {NSLog (@ "Arquivo encontrado e analisado iniciado");}

Esta função é executada no início do processo. Não há necessidade de colocar nada nesta função, mas se você quiser executar uma tarefa quando o arquivo começar a ser analisado, este é o lugar onde você colocaria seu código.

- (void) parseXMLFileAtURL: URL (NSString *){NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; pt-br) AppleWebKit / 525.27.1 (KHTML, como o Gecko) Versão / 3.2.1 Safari / 525.27.1";Pedido NSMutableURLRequest * = NSMutableURLRequest requestWithURL:NSURL URLWithString: URL;request setValue: agentString paraHTTPHeaderField: @ "User-Agent";xmlFile = NSURLConnection sendSynchronousRequest: solicitação retornandoResponse: nil error: nil;artigos = NSMutableArray alloc init;errorParsing = NO;rssParser = alocação NSXMLParser initWithData: xmlFile;rssParser setDelegate: self;// Você pode precisar ativar alguns desses dependendo do tipo de arquivo XML que você está analisandorssParser setShouldProcessNamespaces: NO;rssParser setShouldReportNamespacePrefixes: NO;rssParser setShouldResolveExternalEntities: NO;rssParser parse;}

Essa função instrui o mecanismo a fazer o download de um arquivo em um determinado endereço da Web (URL) e iniciar o processo para analisá-lo. Estamos dizendo ao servidor remoto que somos um Safari rodando no Mac apenas no caso de o servidor tentar redirecionar o iPhone / iPad para uma versão móvel.As opções no final são específicas para determinados arquivos XML. A maioria dos arquivos RSS e arquivos XML genéricos não precisam deles ativados.

- (void) parser: (NSXMLParser *) analisador parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Código de erro% i", código de parseError;NSLog (@ "Erro ao analisar XML:% @", errorString);errorParsing = YES;}Esse é um roteamento simples de verificação de erros que definirá um valor binário se encontrar um erro. Você pode precisar de algo mais específico aqui, dependendo do que você está fazendo. Se você simplesmente precisar executar algum código após o processamento no caso de erro, a variável binária errorParsing poderá ser chamada nesse momento.

- (void) parser: (NSXMLParser *) analisador didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI QualificadoName: (NSString *) Atributos qName: (NSDictionary *) attributeDict {currentElement = cópia elementName;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} A carne do analisador XML contém três funções, uma que é executada no início de um elemento individual, uma que é executada durante o meio da análise do elemento e outra que é executada no final do elemento.

Para este exemplo, analisaremos um arquivo semelhante aos arquivos RSS que dividem elementos em grupos sob o título de "itens" no arquivo XML. No início do processamento, estamos verificando o nome do elemento "item" e alocando o dicionário do item quando um novo grupo é detectado. Caso contrário, inicializamos nossa variável para o valor.

- (void) parser: (NSXMLParser *) parser encontradoCaracteres: (NSString *) string {ElementValue appendString: string;}

Esta é a parte fácil. Quando encontramos personagens, simplesmente os adicionamos à nossa variável "ElementValue".

- (void) parser: (NSXMLParser *) analisador didEndElement: (NSString *) elementName namespaceURI: (NSString *) espaço de nomesURI QualificadoName: (NSString *) qName {if (elementName isEqualToString: @ "item") {artigos addObject: item copy;} outro {item setObject: ElementValue forKey: elementName;}}

Quando terminamos de processar um elemento, precisamos fazer uma de duas coisas: (1) se o elemento final for "item", terminamos nosso grupo, então adicionaremos nosso dicionário à nossa matriz de "artigos". ". Ou (2) se o elemento não for "item", definiremos o valor em nosso dicionário com uma chave que corresponda ao nome do elemento. (Isso significa que não precisamos de uma variável individual para cada campo dentro do arquivo XML. Podemos processá-los um pouco mais dinamicamente.)

- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NÃO){NSLog (@ "processamento de XML feito!");} outro {NSLog (@ "Erro ocorreu durante o processamento XML");}}

Esta é a última função necessária para a nossa rotina de análise. Simplesmente termina o documento. Você vai colocar qualquer código que você quer terminar o processo aqui ou algo especial que você pode querer fazer em caso de erro.

Uma coisa que muitos aplicativos podem querer fazer aqui é salvar os dados e / ou o arquivo XML em um arquivo no dispositivo. Dessa forma, se o usuário não estiver conectado à Internet na próxima vez que carregar o aplicativo, ele ainda poderá obter essas informações.

É claro que não podemos esquecer a parte mais importante: informar seu aplicativo para analisar o arquivo (e fornecer um endereço da Web para encontrá-lo!).

Para iniciar o processo, basta adicionar essa linha de código ao local apropriado em que você deseja fazer o processamento XML:

self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";