Синтаксический анализ XML в Cocoa Touch / iPhone - PullRequest
4 голосов
/ 21 апреля 2009

Хорошо, я видел TouchXML, parseXML, NSXMLDocument, NSXMLParser, но я действительно не понимаю, что делать.

У меня есть приложение для iphone, которое подключается к серверам, запрашивает данные и получает XML-ответ. Пример ответа xml на другой набор запросов: http://pastebin.com/f681c4b04

У меня есть другие классы, которые действуют как контроллеры (как в MVC, чтобы сделать логику выборки данных). Этот класс получает входные данные от классов View и обрабатывает их, например, отправить запрос веб-серверу, получить xml, проанализировать xml, заполнить его переменные (его одноэлементные / совместно используемые классы), а затем ответить вызывающему как true или false. Вызывающая сторона, основываясь на ответе класса контроллера, проверяет переменные контроллера и показывает соответствующее содержимое пользователю.

У меня есть следующие переменные класса контроллера:

@interface backendController : NSObject {
NSMutableDictionary *searchResults, *plantInfoResults, *bookmarkList, *userLoginResult;
}

и такие функции, как getBookmarkList, getPlantInfo. Прямо сейчас я печатаю простой XML, возвращаемый веб-сервером NSLog (@ "Результат::% @" [NSString stringWithContentsOfURL: url])

Мне нужна универсальная функция, которая получает XML, возвращаемый с сервера, анализирует его, создает из него NSMutableDictionary, содержащий текстовое представление открывающих тегов XML в виде ключей и значения тегов XML в качестве значений, и возвращает его.

Только один вопрос, как это сделать?

Ответы [ 3 ]

4 голосов
/ 21 апреля 2009

Вы пробовали какой-либо из парсеров XML, которые вы упомянули? Вот как они устанавливают значение ключа имени узла:

[aBook setValue:currentElementValue forKey:elementName];

P.S. Дважды проверьте ваш XML, хотя, кажется, вам не хватает корневого узла в некоторых из ваших результатов. Если вы не оставили это для простоты.

Взгляните на учебник XML w3schools , он должен указать вам правильное направление для синтаксиса XML.

0 голосов
/ 18 октября 2012

предоставляя вам один простой пример анализа XML в таблице, надеюсь, это поможет вам.

// XMLViewController.h

#import <UIKit/UIKit.h>
@interface TestXMLViewController : UIViewController<NSXMLParserDelegate,UITableViewDelegate,UITableViewDataSource>{
@private
NSXMLParser *xmlParser;
NSInteger depth;
NSMutableString *currentName;
NSString *currentElement;
NSMutableArray *data;
}
@property (nonatomic, strong) IBOutlet UITableView *tableView;
-(void)start;
@end

// TestXMLViewController.m

#import "TestXmlDetail.h"
#import "TestXMLViewController.h"
@interface TestXMLViewController ()
- (void)showCurrentDepth;

@end

@implementation TestXMLViewController

@synthesize tableView;
- (void)start
{
NSString *xml = @"<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Node><name>Main</name><Node><name>first row</name></Node><Node><name>second row</name></Node><Node><name>third row</name></Node></Node>";
xmlParser = [[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
[xmlParser setDelegate:self];
[xmlParser setShouldProcessNamespaces:NO];
[xmlParser setShouldReportNamespacePrefixes:NO];
[xmlParser setShouldResolveExternalEntities:NO];
[xmlParser parse];

}


- (void)parserDidStartDocument:(NSXMLParser *)parser 
{
NSLog(@"Document started");
depth = 0;
currentElement = nil;
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 
{
NSLog(@"Error: %@", [parseError localizedDescription]);
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
attributes:(NSDictionary *)attributeDict
{

currentElement = [elementName copy];

if ([currentElement isEqualToString:@"Node"])
{
    ++depth;
    [self showCurrentDepth];
}
else if ([currentElement isEqualToString:@"name"])
{

    currentName = [[NSMutableString alloc] init];
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName
{

if ([elementName isEqualToString:@"Node"]) 
{
    --depth;
    [self showCurrentDepth];
}
else if ([elementName isEqualToString:@"name"])
{
    if (depth == 1)
    {
        NSLog(@"Outer name tag: %@", currentName);
    }
    else 
    {
        NSLog(@"Inner name tag: %@", currentName);
      [data addObject:currentName];
    }
    }
   }        

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if ([currentElement isEqualToString:@"name"]) 
{
    [currentName appendString:string];
} 
}

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{
    NSLog(@"Document finished", nil);
}



- (void)showCurrentDepth
{
  NSLog(@"Current depth: %d", depth);
}


- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
 data = [[NSMutableArray alloc]init ];
[self start];
self.title=@"XML parsing";
NSLog(@"string is %@",data);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
`enter code here`return [data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
cell.textLabel.text = [data objectAtIndex:indexPath.row];
return cell;
}
@end
0 голосов
/ 22 апреля 2009

Рассмотрим следующий фрагмент кода, который использует libxml2 , Оболочки libxml2 Мэтта Галлахера и ASIHTTPRequest Бена Копси для анализа HTTP-документа.

Чтобы проанализировать XML, используйте PerformXMLXPathQuery вместо PerformHTTPXPathQuery, который я использую в моем примере.

Экземпляр nodes типа NSArray * будет содержать NSDictionary * объектов, которые вы можете рекурсивно анализировать для получения нужных вам данных.

Или, если вам известна схема вашего XML-документа, вы можете написать запрос XPath, чтобы получить значение nodeContent или nodeAttribute напрямую.

ASIHTTPRequest *request = [ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://stackoverflow.com/"];
[request start];
NSError *error = [request error];
if (!error) {
    NSData *response = [request responseData];
    NSLog(@"Root node: %@", [[self query:@"//" withResponse:response] description]);
}
else 
    @throw [NSException exceptionWithName:@"kHTTPRequestFailed" reason:@"Request failed!" userInfo:nil];
[request release];

...

- (id) query:(NSString *)xpathQuery withResponse:(NSData *)respData {
    NSArray *nodes = PerformHTMLXPathQuery(respData, xpathQuery);
    if (nodes != nil)
        return nodes;
    return nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...