首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何抓取XML元素并存储它?目标C

如何抓取XML元素并存储它?目标C
EN

Stack Overflow用户
提问于 2013-07-26 09:09:49
回答 3查看 960关注 0票数 1

我正试着从一个网站上得到一个标记。成功身份验证后,将显示一个XML文档。

我创建了一个连接,如下所示:

代码语言:javascript
运行
复制
NSString *strURLQueryString = [NSString stringWithFormat:@"%@?username=%@&password=%@", kURL_LOGIN, nameString, passwordString];
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:strURLQueryString]
                                                cachePolicy:NSURLRequestUseProtocolCachePolicy
                                            timeoutInterval:60.0];

为了显示输出,我使用了以下内容:

代码语言:javascript
运行
复制
unsigned char byteBuffer[[receivedData length]];
[receivedData getBytes:byteBuffer];
NSLog(@"Output: %s", (char *)byteBuffer);

因此,返回的文档的一些输出如下所示:

代码语言:javascript
运行
复制
    <status>0</status><reason>User fetched.</reason><token>9cb7396dccabe68c067521db219afb83</token>

我读过许多XML解析实现,但是我无法实现它,因为它不能满足我的需要,我只是无法理解其解释的复杂性。

如果有人能给我一个好的建议,我会很感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-26 13:05:46

代码语言:javascript
运行
复制
- (XMLParserViewController *) initXMLParser {


    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    return self;
}

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

    if([elementName isEqualToString:@"Books"]) {
        appDelegate.books = [[NSMutableArray alloc] init];
    }
    else if([elementName isEqualToString:@"Book"])
    {

        aBook = [[Books alloc] init];

    }

    NSLog(@"Processing Element: %@", elementName);
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if(!currentElementValue)
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else
        [currentElementValue appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue);

}

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

    if([elementName isEqualToString:@"Books"])
        return;

    if([elementName isEqualToString:@"Book"])
    {
       [appDelegate.books addObject:aBook];        
          aBook = nil;
    }
    else if([elementName isEqualToString:@"name"])
    {
        aBook.name=currentElementValue;
    }
    else if([elementName isEqualToString:@"address"])
    {
        aBook.address=currentElementValue;
    }
    else if([elementName isEqualToString:@"country"])
    {
        aBook.country=currentElementValue;
    }        

    currentElementValue = nil;


    NSLog(@"%@",aBook.name);
    NSLog(@"%@",aBook.address);
    NSLog(@"%@",aBook.country);
}

试试这个,我希望这个有用..。

票数 1
EN

Stack Overflow用户

发布于 2013-07-26 09:28:09

相关的NSXMLParserDelegate方法:

代码语言:javascript
运行
复制
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName //etc 
{ _inToken = [elementName isEqualToString:@"token"]; }

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName  //etc
{ _inToken = NO; }

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
  if (_inToken) {
      _token = string;
      [parser abortParsing];
  }
}
票数 0
EN

Stack Overflow用户

发布于 2013-07-26 15:06:39

您应该使用XML解析器。这是很容易使用的,采取以下所有步骤以获得最佳效果:

从XMLParser创建NSXMLParser类子类,因此您有一个NSXMLParser.h和NSXMLParser.m类

您的.h类必须如下所示:

代码语言:javascript
运行
复制
#import <Foundation/Foundation.h>

@interface XMLParser : NSXMLParser <NSXMLParserDelegate>{

    NSUInteger parsedCounter;
    BOOL accumulatingParsedCharacterData;
    BOOL didAbortParsing;
}
@property (nonatomic, strong) NSMutableString *currentParsedCharacterData;
@property (nonatomic, strong) NSMutableArray *currentParsedCharacterArray;
@end

和.m类:

代码语言:javascript
运行
复制
#import "XMLParser.h"

@implementation XMLParser

#pragma mark Parser constants

// Limit the number of parsed data to 100.
static const NSUInteger kMaximumNumberOfFilesToParse = 100;

static NSUInteger const kSizeOfFileBatch = 10;

// Reduce potential parsing errors by using string constants declared in a single place.
static NSString * const kEntryElementName = @"dlResult";
static NSString * const kStringElementName = @"string";


#pragma mark NSXMLParser delegate methods

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

//    NSLog(@"didStart");
    // If the number of parsed earthquakes is greater than kMaximumNumberOfEarthquakesToParse, abort the parse.
    if (parsedCounter >= kMaximumNumberOfFilesToParse) {
        // Use the flag didAbortParsing to distinguish between this deliberate stop and other parser errors.
        didAbortParsing = YES;
        [self abortParsing];
    }
    if ([elementName isEqualToString:kEntryElementName]) {
        _currentParsedCharacterArray = [[NSMutableArray alloc]init];

    } else if ([elementName isEqualToString:kStringElementName]) {

        accumulatingParsedCharacterData = YES;
        _currentParsedCharacterData = [[NSMutableString alloc]init];
    }
}

// return string between tags
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//    NSLog(@"foundCh");
    if (accumulatingParsedCharacterData) {
        // If the current element is one whose content we care about, append 'string'
        // to the property that holds the content of the current element.
        [_currentParsedCharacterData appendString:string];
        NSLog(@"currentParsedCharacterData:%@",_currentParsedCharacterData);
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
//    NSLog(@"didEnd");

    if ([elementName isEqualToString:kStringElementName]) {
        [_currentParsedCharacterArray addObject:_currentParsedCharacterData];

    }
    accumulatingParsedCharacterData = NO;
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
       if (didAbortParsing == NO) {
        // Pass the error to the main thread for handling.
        [self performSelectorOnMainThread:@selector(handleError:) withObject:parseError waitUntilDone:NO];
    }
}

@end

在.m类中有两个const字符串:

代码语言:javascript
运行
复制
static NSString * const kEntryElementName = @"dlResult";
static NSString * const kStringElementName = @"string";

这些是字符串标记,您应该实现的标记是“状态”、“原因”“令牌”。

从connection类中,将数据连接发送到XMLParser类,如下所示:

代码语言:javascript
运行
复制
@autoreleasepool {

    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable
    // because it gives less control over the network, particularly in responding to connection errors.
    //
        XMLParser *parser = [[XMLParser alloc] initWithData:data];

        parser.currentParsedCharacterArray = [NSMutableArray array];
        parser.currentParsedCharacterData = [NSMutableString string];
        [parser setDelegate:parser];

        [parser parse];

        // depending on the total number of earthquakes parsed, the last batch might not have been a "full" batch, and thus
        // not been part of the regular batch transfer. So, we check the count of the array and, if necessary, send it to the main thread.

        if ([parser.currentParsedCharacterArray count] > 0) {
            // send parsed data to another class or ...
            // parser.currentParsedCharacterArray is parsed data
        }
        parser.currentParsedCharacterArray = nil;
        parser.currentParsedCharacterData = nil;
    }

如果你有什么问题,问我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17877304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档