iOS - 解析xml DATASET

时间:2013-01-14 05:28:55

标签: objective-c soap xml-parsing nsurlconnection nsxmlparser

这是我需要解析的XML数据

 <GetMessagesResult>
    <NewDataSet xmlns="">
       <Table>
          <Date>21:52:59</Date>
          <Message>ABC</Message>
          <GroupName>ALL</GroupName>
       </Table>
       <Table>
          <Date>11:23:27</Date>
          <Message>DEF</Message>
          <GroupName>ALL</GroupName>
       </Table>
   </NewDataSet>
 </GetMessagesResult>

这是我的SCMessages.h文件

#import <Foundation/Foundation.h>
@interface SCMessages : NSObject
{
    NSDate *Date;
    NSString *Message;
    NSString *GroupName;
}
@property (nonatomic, retain) NSDate *Date;
@property (nonatomic, retain) NSString *Message;
@property (nonatomic, retain) NSString *GroupName;

这是我的SCMessages.m文件

#import "SCMessages.h"
@implementation SCMessages
@synthesize Date;
@synthesize Message,GroupName;
- (void)dealloc
{
    [super dealloc];
    [Date release];
    [Message release];
    [GroupName release];
}
@end

我使用下面的代码使用NSXMLParser委托方法

来解析数据
#pragma mark - NSXMLParser Delegate

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName
   attributes: (NSDictionary *)attributeDict
{
    if( [elementName isEqualToString:@"GetMessagesResult"])
    {
        if(!soapResults)
        soapResults = [[NSMutableString alloc] init];
        recordResults = TRUE;
    }

    if([elementName isEqualToString:@"NewDataSet"]) {
        //Initialize the array.
        messages = [[NSMutableArray alloc] init];
    }
    else if([elementName isEqualToString:@"Table"]) {
        //Initialize the message.
        aMessage = [[SCMessages alloc] init];
    }
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if( recordResults )
        [soapResults appendString: string];
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"Table"]) {
        [messages addObject:aMessage];
            NSLog(@"MESSAGES COUNT: %d",messages.count);
            NSLog(@"MESSAGE: %@",aMessage);
        [aMessage release];
        aMessage = nil;
    }
    // as this is the last element
    if( [elementName isEqualToString:@"NewDataSet"])
    {
        recordResults = FALSE;
    }
}

问题 我没有使用Date,Meesage&amp;获取所需的消息对象。组名。

我把NSLog打印出来但我总是得到空值。奇怪的是消息数组被分配内存&amp;还有元素被添加到数组中,因为我可以看到NSLog中的消息数组计数,但数组元素的数据为空值。

我在NSURLConnection委托方法connectionDidFinishLoading

中解析SOAP响应中收到的XML数据
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"theXML: \n%@",theXML);

2 个答案:

答案 0 :(得分:0)

您的didEnd方法缺少将累积的字符串存储到属性中的代码。您需要一个用于当前SCMessage对象的ivar。

将文本内容附加到可变字符串ivar。然后在关闭元素时,您必须决定在SCMessage上设置哪个属性。您可能必须将日期解析为NSDate。

答案 1 :(得分:0)

您需要将值存储在aMessage中。您已将特定对象添加到数组但您忘记将数据存储在SCMessages类的该对象中。您还可以在调试时检查您是否在aMessage对象中获得了值。

您需要在此didEndElement方法中存储这样的值。

 [aMessage setValue: soapResults forKey:elementName];

我认为这会对你有帮助。