2012-10-18 50 views
1

我有一个需要解析的XML文件。 我已经解析过一个XML,但它更简单。由于此文件具有相似的标签,因此我无法弄清楚如何解析它。解析具有相同标记的XML文件

的xml文件看起来是这样的:

<resource classname="Quote"> 
<field name="name">USD/KRW</field> 
<field name="price">1104.319946</field> 
<field name="symbol">KRW=X</field> 
<field name="ts">1350544190</field> 
<field name="type">currency</field> 
<field name="utctime">2012-10-18T07:09:50+0000</field> 
<field name="volume">-56144</field> 
</resource> 

我想要得到的价格领域,并将其添加到一个数组。我尝试了一些在线示例中的代码,但它显示了所有字段的值,我只需要price字段。

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

    if ([[attributeDict objectForKey:@"name"] isEqualToString:@"price"]) 
    { 

     currencyValuesString = [[NSMutableString alloc]init]; 
    } 

} 


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementname isEqualToString:@"field"]) 
    { 
     [currencyValuesArray addObject:currencyValuesString]; 
    } 
} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    currencyValuesString = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

回答

2

没有您的代码中的多个问题:

  • 您分配/初始化时输入您<field name="price">标签currencyValuesString,但你永远不释放它(这将泄漏

    在.M

    如果你不使用ARC),更重要的是你不使用这个分配的实例,因为在你的-parser:foundCharacters:中,你用这个变量的值替换用不同的字符串。

  • 因此,以前分配NSMutableString是完全没用的。此外,如果您的字段将包含多个文本而不是一个(例如<field name="price">1.234<b>€</b></field>),则-parser:foundCharacters:将被多次调用,但是您的代码将始终丢弃以前的值并仅保留最后一个块而不是将它们添加到NSMutableString
  • 如果事实上,使用你的代码,没有一个点有NSMutableString,因为你不使用它作为可变字符串,而只是每次替换每个值而不是附加它。

而且,每次遇到一个结束</field>标签的时候,不管这个标记是,在执行[currencyValuesArray addObject:currencyValuesString];,但不要松开currencyValuesString(仅当您使用ARC这是很好的,但是如果你使用手册会泄漏引用计数),更重要的是你会将这个字符串添加到数组每次你遇到了关闭</field>标签,无论开标签的name是什么。因此,您可以多次向阵列中添加价格,因为价格后有</field>结束标签。

所以,正确的做法是:

  • 追加foundCharacters您NSMutableString不是替换它
  • 当你遇到结束标记,价格添加到阵列中,但随后释放并设置价格字符串立即返回nil。通过这种方式,currencyValuesString只会是<field name="price">开放标记之间围绕其相应</field>关闭标签,而不是解析其他<field>标签时
  • 价格只会增加您的数组中的结束标记,如果currencyValuesStringnil

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if ([[attributeDict objectForKey:@"name"] isEqualToString:@"price"]) 
    { 
     currencyValuesString = [[NSMutableString alloc]init]; 
    } 
} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    [currencyValuesString appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 
} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementname isEqualToString:@"field"] && (currencyValuesString != nil)) 
    { 
     [currencyValuesArray addObject:currencyValuesString]; 
     [currencyValuesString release]; // Only needed if not using ARC. Remove this line if you use ARC 
     currencyValuesString = nil; // so that the next closing tag won't readd the price 
    } 
} 
+0

感谢Ali的工作正常,并感谢您的建议。 – ichanduu

+0

我应该怎么做,如果我想另一个字段像name.should我采取另一个字符串和数组? – ichanduu

+0

您可以为每个字段设置不同的可变字符串,但这不会非常有效。你最好在实例变量中存储当前正在分析的字段。做到这一点的方式取决于你:要么为你管理的每个字段声明一个类型为“enum”的值,并且要使用这个枚举类型的伊娃,根据name属性在'didStartElement'中设置它的值,然后在你的'didEndElement'中的这个ivar上'switch'来做不同的事情,这取决于当前正在处理哪个字段。 – AliSoftware

-1

试试这个:

在.H

的NSXMLParser * rssParser

;

NSDictionary * myAttrDict;

NSString * currentElement;

NSMutableArray * prizeArr;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"field"]) 
    {   
     if([[attributeDict objectForKey:@"name"] isEqualToString:@"price"]) 
     { 
      currentElement = @"price"; 
     } 
     else{ 
      currentElement = nil; 
     } 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if([currentElement isEqualToString:@"price"]) 
    { 
     [prizeArr addObject:string]; 
    } 
    NSLog(@"prizeArr :%@",prizeArr); 
} 

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

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
} 
+0

为什么不采用负前添加你的话,我个人认为,这是不好的做法。 – kulss

相关问题