0

これは、解析する必要がある 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 、および GroupName を使用して目的のメッセージ オブジェクトを取得できません。

私はNSLogそれらを印刷しましたが、常に null 値を取得します。奇妙なことは、メッセージ配列が割り当てられたメモリを取得し、メッセージ配列のカウントを確認できるように要素が配列に追加されることですNSLogが、配列要素には null 値としてデータがあります。

NSURLConnection デリゲート メソッドで SOAP 応答で受信した XML データを解析していますconnectionDidFinishLoading

NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"theXML: \n%@",theXML);
4

2 に答える 2

0

didEndメソッドに、蓄積された文字列をプロパティに格納するためのコードがありません。現在のSCMessageオブジェクトにはivarが必要です。

テキストコンテンツを可変文字列ivarに追加します。次に、要素を閉じるときに、SCMessageに設定するプロパティを決定する必要があります。おそらく、日付を解析してNSDateにする必要があります。

于 2013-01-14T06:27:20.080 に答える
0

に値を保存する必要がありますaMessage。特定のオブジェクトを配列に追加しましたが、SCMessages クラスのそのオブジェクトにデータを格納するのを忘れていましたaMessage。オブジェクトで値を取得していることをデバッグ中に確認することもできます。

このdidEndElementメソッドには、このような値を格納する必要があります。

 [aMessage setValue: soapResults forKey:elementName];

これが役立つと思います。

于 2013-01-14T21:09:06.620 に答える