【问题标题】:ObjC parsing a xml and stock values in NSArrayObjC 解析 NSArray 中的 xml 和库存值
【发布时间】:2011-01-15 18:15:02
【问题描述】:

我的 xlm 阅读器有问题。我有一些货币骑手我想存入一个数组,但我的代码有问题。

这是我想阅读的提要: http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml

错误在

头文件

@class Convertisseur;


@interface Convertisseur1ViewController : 
   UIViewController <UITextFieldDelegate>{

    IBOutlet UILabel *usd;
    IBOutlet UILabel *euro;
 Convertisseur *convertisseur;


     // parser XML
    NSXMLParser *rssParser;
     // elenco degli elementi letti dal feed
    NSMutableArray *elencoFeed;

     //variabile temporanea pe ogni elemento
    NSMutableDictionary *item;

     // valori dei campi letti dal feed
    NSString *currentElement;
    NSMutableString *currentCube;

    NSArray *currency;
}


//Dichiarazion del parser
 - (void)parseXMLFileAtURL:(NSString *)URL;
@end

实现文件

#import "Convertisseur1ViewController.h"
#import "Convertisseur.h"

@implementation Convertisseur1ViewController




- (void)parseXMLFileAtURL:(NSString *)URL {
  // inizializziamo la lista degli elementi
 elencoFeed = [[NSMutableArray alloc] init];

  // dobbiamo convertire la stringa "URL" in un elemento "NSURL"
 NSURL *xmlURL = [NSURL URLWithString:URL];

  // inizializziamo il nostro parser XML
 rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

 [rssParser setDelegate:self];

  // settiamo alcune proprietà
 [rssParser setShouldProcessNamespaces:NO];
 [rssParser setShouldReportNamespacePrefixes:NO];
 [rssParser setShouldResolveExternalEntities:NO];

  // avviamo il parsing del feed RSS
 [rssParser parse];
}




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

 currentElement = [elementName copy];
 if ([elementName isEqualToString:@"item"]) {
   // inizializza tutti gli elementi
  item = [[NSMutableDictionary alloc] init];
  currentCube = [[NSMutableString alloc] init];
 }
}

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

 if ([elementName isEqualToString:@"Cube"]) {
  /* salva tutte le proprietà del feed letto nell'elemento "item", per
   poi inserirlo nell'array "elencoFeed" */
  [item setObject:currentCube forKey:@"Cube"];

  [elencoFeed addObject:[item copy]];
 }
}




- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{;
  // salva i caratteri per l'elemento corrente
 if ([currentElement isEqualToString:@"Cube"]){
  [currentCube appendString:string];
 }
}






- (void) parserDidEndDocument:(NSXMLParser *)parser {


 for(int i=1;i<[elencoFeed count];i++) {

  [currency setvalue:[[elencoFeed Objectatindex:i] valueforkey:@"rate"] forkey:[[elencoFeed Objectatindex:i] valueforkey:@"currency"]];
  //currency[i]= [elencoFeed Objectatindex:i] valueforkey:@"rate"] forkey:[[elencoFeed Objectatindex:i] valueforkey:@"currency"];

 }

}



 - (void)viewDidLoad {
 [super viewDidLoad];
 convertisseur = [[Convertisseur alloc] init];


  self.title = @"Convertisseur";

  NSString *path = @"http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml";
  [self parseXMLFileAtURL:path];
  euro.text =  currency.text;
 }



- (void)viewDidUnload {
  // Release any retained subviews of the main view.
  // e.g. self.myOutlet = nil;
 self.labelEuro = nil;
 self.labelDollar = nil;
 self.convertisseur = nil;

 }



- (void)dealloc {
    [super dealloc];
}

这里有一个警告:

 [currency setvalue:[[elencoFeed Objectatindex:i] valueforkey:@"rate"] forkey:[[elencoFeed Objectatindex:i] valueforkey:@"currency"]];

NSMutable 数组可能无法响应“-objectindex”

这里有个错误:

euro.text =  currency.text;

以非结构或联合的形式请求成员“文本”(货币是数组,欧元是标签)

【问题讨论】:

标签: iphone objective-c xml arrays nsarray


【解决方案1】:

Objective C 区分大小写。正确的签名是objectAtIndex:(在其他一些地方还有valueForKey:setValue:forKey:)。

您对currency.text 有什么期望?这是NSArray 的一个实例,它没有text 属性。

旁注:我认为人们应该在代码中完全避免使用母语。但是你绝对不应该在意大利语和英语之间混用。选择一个并坚持下去(最好是英文)。

【讨论】:

  • "currency.text?它是一个没有文本属性的 NSArray 实例" 好的,那么我如何获取里面的值? currency.value 不起作用。谢谢你的回答
  • 有我的新行,但建议仍然存在...应用程序无法启动。 [货币 setValue:[[elencoFeed ObjectAtIndex:i] valueForKey:@"rate"] forKey:[[elencoFeed ObjectAtIndex:i] valueForKey:@"currency"]];
  • 您似乎想在货币数组中存储几个值。为此,您必须首先将其声明为 NSMutableArray,然后您可以在 parserDidEndDocument: 中使用 [currency addObject:&lt;object&gt;];。要稍后从货币中访问值,您必须使用 [currency objectAtIndex:&lt;whatever index you want]; 确定您想要的值
  • [currency addObject[[elencoFeed ObjectAtIndex:i] valueForKey:@"rate"] forKey:[[elencoFeed ObjectAtIndex:i] valueForKey:@"currency"]];某处一定有解析错误,否则我不要求正确的方法
  • addObject 后面没有冒号,而forKey:blablabla 是完全错误的。如果您不确定它是如何工作的,请阅读 NSArray 上的文档。
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多