【问题标题】:XML Parsing in Cocoa Touch/iPhoneCocoa Touch/iPhone 中的 XML 解析
【发布时间】:2009-04-21 17:21:48
【问题描述】:

好吧,我已经看过 TouchXML、parseXML、NSXMLDocument、NSXMLParser,但我真的不知道该怎么做。

我有一个连接到服务器、请求数据并获取 XML 响应的 iphone 应用程序。 http://pastebin.com/f681c4b04

给出了对不同查询集的示例 xml 响应

我有另一个类充当控制器(如在 MVC 中,执行获取数据的逻辑)。此类从 View 类获取输入并对其进行处理,例如向网络服务器发送请求,获取 xml,解析 xml,填充其变量(它的单例/共享类),然后以 true 或 false 响应调用者。调用者根据控制器类给出的响应,检查控制器的变量并向用户显示适当的内容。

我有以下控制器类变量:

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

以及 getBookmarkList、getPlantInfo 等函数。现在我正在打印由网络服务器返回的纯 XML NSLog(@"Result: :%@" [NSString stringWithContentsOfURL:url])

我想要一个通用函数,它获取从服务器返回的 XML,对其进行解析,生成一个 NSMutableDictionary,其中包含作为键的 XML 开始标签的文本表示形式和作为值的 XML 标签值并返回它。

只有一个问题,怎么做?

【问题讨论】:

  • 仍然期待我如何使用 TouchXML 制作一个通用函数来解析pastebin.com/m53d8bf41 处的 XML,制作一个包含所有内容的字典,其中包含标签作为键和标签值作为其中的值.
  • 我可以通过pastebin.ca/1404334 解决我的问题,请随时发表评论...谢谢大家的帮助

标签: iphone xml cocoa-touch


【解决方案1】:

您是否尝试过您提到的任何 XML 解析器?这是他们设置节点名称的键值的方式:

[aBook setValue:currentElementValue forKey:elementName];

附:不过,请仔细检查您的 XML,似乎您在某些结果中缺少根节点。除非您为了简单起见而忽略了它。

看看w3schools XML tutorial,它应该为您指明正确的 XML 语法方向。

【讨论】:

  • 查看您的获取书签的结果,您的 XML 是 .........在 XML 中,您需要一个节点您所有条目的父级:........。看看w3schools的教程,我会加答案的链接。
  • 好的,我修改了 XML,服务器返回的新 XML 是:pastebin.com/m6723d678,其中还包含执行 pastebin.com/m3528fa82 时的错误/警告。我似乎无法使用 TouchXML 以正常方式解析 XML。请帮忙。
  • 我认为这是因为我在返回的 XML 的开头有 4 个空行。
  • 还尝试了:NSString *r2 = @"460Alcea rosea 'Nigra'Black Hollyhock";我在控制台上得到以下信息:2009-04-23 08:57:06.067 Landscapedia[1926:20b] 开始 XML Parsing 2009-04-23 08:57:06.125 Landscapedia[1926:20b] 打印节点:()没有警告但也没有数据,代码和上次的pastebin一样
  • 我之前没用过TouchXML,今晚我可以试试你的XML,看看有没有结果。我使用过 NSXMLParser,我在答案中添加了链接的教程很容易遵循,我建议尝试一下。我会用你的 XML 尝试后报告。
【解决方案2】:

考虑以下代码 sn-p,它使用 libxml2Matt Gallagher's libxml2 wrappersBen Copsey's ASIHTTPRequest 来解析 HTTP 文档。

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

NSArray * 类型的 nodes 实例将包含 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;
}

【讨论】:

    【解决方案3】:

    提供一个简单的解析Table中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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多