Синтаксический анализ XML в Cocoa Touch /iPhone

Хорошо, я видел 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 в качестве значений, и возвращает его.

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

4 голоса | спросил Shoaibi 21 PMpTue, 21 Apr 2009 21:21:48 +040021Tuesday 2009, 21:21:48

3 ответа


0

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

[aBook setValue:currentElementValue forKey:elementName];

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

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

ответил Sean 21 PMpTue, 21 Apr 2009 21:31:29 +040031Tuesday 2009, 21:31:29
0

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

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

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

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

nodeAttribute
ответил Alex Reynolds 22 AMpWed, 22 Apr 2009 04:28:34 +040028Wednesday 2009, 04:28:34
0

предоставляя вам один простой пример анализа 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];
[email protected]"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
ответил Ravi_Parmar 18 +04002012-10-18T12:22:45+04:00312012bEurope/MoscowThu, 18 Oct 2012 12:22:45 +0400 2012, 12:22:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132