0

XML ファイルから NSMutableArray を構築しており、XML ファイル内の各常駐 ID の数を返す必要があります。これを行うことは可能ですか?

<residents>
<resident id="1">
    <name>
        <first>Daffy</first>
        <last>Duck</last>
    </name>
</resident>

<resident id="2">
    <name>
        <first>Mickey</first>
        <last>Mouse</last>
    </name>
</resident>

等...

次のようなコードを使用してカウントを返します。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"Count = %i", [appDelegate.residents count]);
return [appDelegate.residents count];

助言がありますか?

配列の場合、AppDelegate.h には次のものがあります。

    @interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    UIWindow *window;
    UINavigationController *navigationController;

    NSMutableArray *residents; 
}


@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) NSMutableArray *residents;

XMLAppDelegate.h では、次を使用します。

    @interface XMLAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;

    NSMutableArray *residents;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) NSMutableArray *residents;

@end
4

2 に答える 2

0

私が理解しているように、必要なのは の数だけです。もしそうなら、あなたは次のことができます。

NSData *data = // your XML Data either from webservice or local file. Not xml string but the Data.
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];

このコードは、データを取得する場所になります。.h ファイル内:

@interface yourViewController : UIViewController {
     NSInteger resedintsCount;
}

あなたの.mファイルで:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
      if([elementName isEqualsToString:@"resident"]) {
           resedintsCount++;
      }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
     // you can use resedintsCount 
}

View ControllerでXMLデータを取得していると仮定しました。AppDelegate または同じプロセス以外のクラスで取得している場合は、そこに存在します。それでも混乱している場合は、お気軽にお尋ねください。

于 2012-05-02T12:09:14.017 に答える
0

何かをカウントする前に、NSXMLParser (およびそれぞれ NSXMLParserDelegate) を使用し、XML データを NSMutableArray に正しく解析する必要があります。また、日常の XML データを保存するには、その情報を NSMutableDictionaries に配置することをお勧めします。

.h @interface では、IVAR を作成する必要があります (例のみ)。

 @interface YourObject : UIViewController <NSXMLParserDelegate> {
   NSXMLParser *parser;
   NSString *currentElement;
   NSMutableString *firstName;
   NSMutableString *lastName;
   NSMutableArray *residents;
 }

.m コードのどこかで、次のように呼び出します。

   NSString *xmlLocationString = @"http://www.website.com/feed.xml";
   NSURL *xmlLocationURL = [NSURL URLWithString:xmlLocationString];
   parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlLocationURL];
   [parser setDelegate:self];
   [parser setShouldProcessNamespaces:NO];
   [parser setShouldReportNamespacePrefixes:NO];
   [parser setShouldResolveExternalEntities:NO];
   [parser parse];

そしてもちろん、XML ドキュメントを実際に NSMutableArray に解析するデリゲート メソッドを設定します。

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

  currentElement = nil;
  currentElement = [elementName copy];
  if ([elementName isEqualToString:@"day"]) {
    firstName = [[NSMutableString alloc]init];
    lastName = [[NSMutableString alloc]init];
}

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

   string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
   string = [string stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]];

   if ([currentElement isEqualToString:@"first"]) {
    [firstName appendString:string];
   } else if ([currentElement isEqualToString:@"last"]) {
    [lastName appendString:string];
   } else {
     ...
   }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{   
      if ([elementName isEqualToString:@"day"]) {
        NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
        [dictionary setObject:firstName forKey:@"fname"];
        [dictionary setObject:lastName forKey:@"lname"];
        //And finally
        [residents addObject:dictionary];
      }
}

次に、コード内のどこでも呼び出すことができます

[residents count]; 

居住者の合計数を取得します。

注意: このコードは私が行ったとおりに書いたもので、おそらくいくつかのバグがあります

于 2012-04-26T20:24:02.253 に答える