如何在iPhone程序中获取解析后的xml文件元素并对其进行验证

如何在iPhone程序中获取解析后的xml文件元素并对其进行验证,iphone,ios,ios6,Iphone,Ios,Ios6,我已经成功地从远程web服务器解析了XML文件。我的XML包含几个元素,其中包含图像链接。我想在不同的UIImageView上分配图像,因为我尝试了下面的方法,但由于获取元素的所有图像而失败。因此,我无法为特定UIImageView指定特定图像。谁能建议我怎么做 MyXML <?xml version="1.0" encoding="UTF-8"?> <Products> <Main id="0"> <name>Main</name

我已经成功地从远程web服务器解析了XML文件。我的XML包含几个元素,其中包含图像链接。我想在不同的UIImageView上分配图像,因为我尝试了下面的方法,但由于获取元素的所有图像而失败。因此,我无法为特定UIImageView指定特定图像。谁能建议我怎么做

MyXML

<?xml version="1.0" encoding="UTF-8"?>
<Products>
  <Main id="0">
   <name>Main</name>
   <mainimage id="1">http://sample.com/images/first.png</mainimage>
   <mainimage id="2">http://sample.com/images/second.png</mainimage>
  </Main>
  <Category id="1">
   <name>category1</name>
   <categoryimage id="1">http://sample.com/images/img1.png</categoryimage>
  </Category>
  <Category id="2">
   <name>category2</name>
   <categoryimage id="2">http://sample.com/images/img2.png</categoryimage>
   <subcategoryimage id="1">http://sample.com/images/img5.png</subcategoryimage>
   <subcategoryimage id="2">http://sample.com/images/img4.png</subcategoryimage>
  </Category>
</Products>
在视图控制器中,当我想获取
Main
元素的图像时,我只获取XML的
类别
元素

视图控制器

[super viewDidLoad];
 NSURL *url = [NSURL URLWithString:@"http://www.sample.com/Category.xml"];
 EGSParser *parser = [[EGSParser alloc] init];
 if ([parser loadXMLByURL:url])
    self.xmlProductsResults = parser.products;
    EGSProduct *prod = (EGSProduct *)[self.xmlProductsResults objectAtIndex:0];
    NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:prod.imageUrlString]];
    self.firstImage.image = [UIImage imageWithData:mydata];
 }

当您在DiEndElement中遇到
mainimage
元素时,必须将值分配给
self.currentProduct.imageUrlString
i、 e


对于这种情况,我更喜欢更简单的XML解析器 看看这个
@Ravindra给了你正确的答案,你需要在数组中管理你的数据。 另外
self.currentProduct.name=self.currentElementContent
此行将替换主图像数据。

所以最好使用字典结构,我认为你无法获得特定图像视图的特定图像。我认为您正在尝试分别获取主映像、类别映像和子类别映像。。并尝试相应地使用它们。您可以在字典中重新格式化数据,如下所示

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
  if([elementName isEqualToString:@"Products"]){
     mainImages=[[NSMutableArray alloc] init];
     catImages=[[NSMutableArray alloc] init];
     subCatImages=[[NSMutableArray alloc] init];
  }

}
{“主图像”:[“图像1”,“图像2”],“类别图像”:[“图像1”,“图像2”],“子类别图像”:[“图像1”,“图像2”]}

您可以通过为3个类别使用3个可变数组来实现上述目标。只需按如下要求存储数据

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
  if([elementName isEqualToString:@"Products"]){
     mainImages=[[NSMutableArray alloc] init];
     catImages=[[NSMutableArray alloc] init];
     subCatImages=[[NSMutableArray alloc] init];
  }

}
最后

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

   if ([elementName isEqualToString:@"mainimage"]){
       [mainImages addObject:self.currentElementContent];

   }else if ([elementName isEqualToString:@"categoryimage"]){
       [catImages addObject:self.currentElementContent];

   }else if ([elementName isEqualToString:@"subcategoryimage"]){
       [subCatImages addObject:self.currentElementContent];

   }

   self.currentElementContent = nil;
 }

我想这是你想要的。。如果您想使用更多信息,可以使用字典或类对象。

我不熟悉xml解析,但在json中,您可以在解析时获得字典和数组。它必须是完全相同的xml。你能建议任何参考链接如何在iphone中使用json,因为我不知道它。是的:。。。而且它比xml更容易让人阅读。你能详细描述一下你的问题吗?我试过使用你的代码,但仍然只在视图控制器中获取
类别
元素。我是否需要更改视图控制器中的任何内容,以使
Main
元素完全符合我的预期。。当我使用上面的代码时,我遇到了一个错误,应用程序被终止,说
***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'***-[\uu NSArrayM insertObject:atIndex:::]:对象不能为零'
self.currentElementContent=nil;应该在结尾,而不是didEnd函数的第一行。。更改应该可以工作的代码..当我调试时,我看到错误来自视图控制器代码,如上图所示。我更改了self.xmlProductsResults=parser.products
to
self.xmlProductsResults=parser.mainimages视图中的控制器如上所述,但应用程序仍会终止。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

   if ([elementName isEqualToString:@"mainimage"]){
       [mainImages addObject:self.currentElementContent];

   }else if ([elementName isEqualToString:@"categoryimage"]){
       [catImages addObject:self.currentElementContent];

   }else if ([elementName isEqualToString:@"subcategoryimage"]){
       [subCatImages addObject:self.currentElementContent];

   }

   self.currentElementContent = nil;
 }