Como analisar arquivos XML no Xcode

click fraud protection

Embora um embutido XML parser agrega valor real a um novo desktop ou aplicativo móvel, codificar essa funcionalidade normalmente requer muito tempo de desenvolvimento e testes beta. O programa Xcode da Apple inclui um analisador XML que ignora a maior parte deste trabalho manual.

A XML arquivo pode conter qualquer coisa, desde dados básicos sobre seu aplicativo a um feed RSS para um site. Eles também podem ser uma ótima maneira de atualizar informações em 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.

O Processo Xcode

O processo Xcode embutido contém etapas para inicializar as variáveis ​​a serem usadas, iniciando o processo do analisador XML, alimentando esse processo com um arquivo, avaliar elementos individuais e os caracteres (valor) dentro desses elementos, reconhecer o fim de um elemento individual e encerrar a análise processar.

Use o analisador XML

Para ilustrar os detalhes, analisaremos um arquivo de exemplo da Internet, passando a ele um endereço da web específico (

instagram viewer
URL).

Comece criando o arquivo de cabeçalho. Este é um exemplo de 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 (não atômico, reter) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL;


A função parseXMLFileAtURL inicia o processo. Quando termina, os "artigos" do NSMutableArray contêm os dados. A matriz consiste em dicionários mutáveis ​​com chaves relacionadas aos nomes dos campos no arquivo XML.

Em seguida, inicialize o processo:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Arquivo encontrado e análise iniciada");
}

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

Instrua o programa para baixar algo

Em seguida, instrua o programa a baixar algo:

- (void) parseXMLFileAtURL: (NSString *) URL
{
NSString * agentString = @ "Mozilla / 5.0 (Macintosh; VOCÊ; Intel Mac OS X 10_5_6; pt-br) AppleWebKit / 525.27.1 (KHTML, como Gecko) Versão / 3.2.1 Safari / 525.27.1 ";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[solicitar setValue: agentString paraHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: pedido que retornaResponse: erro nulo: nulo];
artigos = [[NSMutableArray alloc] init];
errorParsing = NÃO;
rssParser = [[NSXMLParser aloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Pode ser necessário ativar alguns deles, dependendo do tipo de arquivo XML que você está analisando
[rssParser setShouldProcessNamespaces: NÃO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser parse];
}


Esta função instrui o mecanismo a baixar um arquivo em um determinado endereço da web (URL) e iniciar o processo de análise. Informamos ao servidor remoto que somos um Safari rodando no Mac, caso o servidor tente 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.

Verifique o resultado de erros

Execute algumas verificações básicas de erros no resultado:

- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Código de erro% i", [parseError code]];
NSLog (@ "Erro ao analisar XML:% @", errorString);
errorParsing = SIM;
} Este roteamento de verificação de erros define um valor binário se encontrar um erro. Você pode precisar de algo mais específico aqui, dependendo do que está fazendo. Se você simplesmente precisar executar algum código após o processamento em caso de erro, o


Esta rotina de verificação de erros define um valor binário se encontrar um erro. Você pode precisar de algo mais específico aqui, dependendo do que está fazendo. Se você simplesmente precisar executar algum código após o processamento em caso de erro, a variável binária de análise de erro pode ser chamada nesse momento.

Analise o conteúdo recuperado

Em seguida, o programa divide o conteúdo recuperado e o analisa:

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI QualityName: (NSString *) qName atributos: (NSDictionary *) attributeDict {
currentElement = [cópia elementName];
ElementValue = [[NSMutableString aloc] init];
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];
}
}


A parte principal do analisador XML contém três funções, uma que é executada no início de um indivíduo elemento, um que é executado durante a análise do elemento e outro que é executado no final do elemento.

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

- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
[ElementValue appendString: string];
}


Quando encontramos caracteres, simplesmente os adicionamos à nossa variável ElementValue:

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualificadoNome: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[artigos addObject: [cópia do item]];
} senão {
[item setObject: ElementValue forKey: elementName];
}
}

O que acontece quando a análise é concluída

Quando o programa termina de processar um elemento, ele deve fazer uma das duas coisas:

  • Se o elemento final for item, terminamos nosso grupo, então adicionaremos nosso dicionário ao nosso conjunto de artigos.
  • 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 no arquivo XML. Podemos processá-los um pouco mais dinamicamente.)

Esta é a última função necessária para nossa rotina de análise; termina o documento. Coloque qualquer código final aqui ou especifique uma sub-rotina de correção de erros:

- (void) parserDidEndDocument: (NSXMLParser *) parser {
if (errorParsing == NO)
{
NSLog (@ "Processamento XML concluído!");
} senão {
NSLog (@ "Ocorreu um erro durante o processamento de XML");
}
}

Salve os dados

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

Claro, não podemos esquecer a parte mais importante: dizer ao seu aplicativo para analisar o arquivo (e fornecer um endereço da web para localizá-lo!). Para iniciar o processo, adicione esta linha de código ao local apropriado onde deseja fazer o processamento XML:

 [self parseXMLFileAtURL: @ " http://www.webaddress.com/file.xml"]; 
instagram story viewer