2009-04-21 62 views
4

好的,我已經看到TouchXML,parseXML,NSXMLDocument,NSXMLParser,但我真的很困惑該怎麼做。Cocoa Touch/iPhone中的XML解析

我有一個iPhone應用程序連接到服務器,請求數據並獲取XML響應。示例XML響應不同的查詢集是在http://pastebin.com/f681c4b04

我有另一個類作爲控制器(如在MVC中,做邏輯取數據)。這個類從View類獲得輸入並處理它,例如向web服務器發送請求,獲取xml,分析xml,填充它的變量(它是一個單獨的/共享的類),然後對調用者響應爲真或假。呼叫者基於控制器類給出的響應檢查控制器的變量並向用戶顯示適當的內容。

我有以下的控制器類變量:

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

和功能等getBookmarkList,getPlantInfo。現在我打印由Web服務器通過 NSLog(@「Result::%@」[NSString stringWithContentsOfURL:url])簡單的XML返回

我想要一個通用函數,它從服務器返回XML,解析它,使它的NSMutableDictionary包含XML開始標記的文本表示形式爲鍵和XML標記值作爲值並返回。

只有一個問題,該怎麼做?

+0

還在期待我如何使用TouchXML做出將在http://pastebin.com/m53d8bf41解析XML的通用功能,使在那裏所有的東西字典,標籤密鑰和標籤值作爲它的值。 – Shoaibi 2009-04-26 08:01:40

+0

我能夠通過http://pastebin.ca/1404334解決我的問題隨時發表評論...感謝球員的所有幫助 – Shoaibi 2009-04-27 02:00:30

回答

4

你有沒有嘗試過任何你提到的XML解析器?這是他們如何設置節點名稱的關鍵值:

[aBook setValue:currentElementValue forKey:elementName]; 

P.S.儘管如此,仔細檢查你的XML,看起來你在某些結果上缺少一個根節點。除非你爲了簡單而離開它。

看一看w3schools XML tutorial,它應該指出你的XML語法的正確方向。

0

請考慮以下代碼片段,它使用libxml2,Matt Gallagher's libxml2 wrappersBen Copsey's ASIHTTPRequest來解析HTTP文檔。

要解析XML,請使用PerformXMLXPathQuery而不是我在示例中使用的PerformHTTPXPathQuery

nodesNSArray *類型的實例將包含NSDictionary *對象,您可以遞歸地解析以獲取所需的數據。或者,如果您知道XML文檔的方案,則可以編寫XPath查詢以直接獲取nodeContentnodeAttribute的值。

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; 
} 
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。米

#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