如何在解析后获取xml文件的元素并在iPhone程序中对其进行验证
Posted
技术标签:
【中文标题】如何在解析后获取xml文件的元素并在iPhone程序中对其进行验证【英文标题】:how to get the element of xml file after parsing and validate it in program for iPhone 【发布时间】:2013-02-07 07:30:21 【问题描述】:我已成功解析来自远程 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>
XML 解析
- (BOOL)loadXMLByURL:(NSURL *)url
self.parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
self.parser.delegate = self;
return [self.parser parse];
- (void)parserDidStartDocument:(NSXMLParser *)parser
self.products = [[NSMutableArray alloc] init];
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
if([elementName isEqualToString:@"mainimage"])
self.currentProduct = [[EGSProduct alloc] init];
self.currentProduct.imageIdentifier = attributeDict[@"id"];
if ([elementName isEqualToString:@"Category"])
self.currentProduct = [[EGSProduct alloc] init];
self.currentProduct.imageIdentifier = attributeDict[@"id"];
else if ([elementName isEqualToString:@"subcategoryimage"])
self.currentSubProduct = [[EGSProduct alloc] init];
self.currentSubProduct.imageIdentifier = attributeDict[@"id"];
if (self.currentProduct.subProducts == nil)
self.currentProduct.subProducts = [NSMutableArray array];
self.currentSubProduct.imageIdentifier = attributeDict[@"id"];
self.currentElementContent = [[NSMutableString alloc] init];
else if ([elementName isEqualToString:@"name"] || [elementName isEqualToString:@"categoryimage"])
self.currentElementContent = [[NSMutableString alloc] init];
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
if ([elementName isEqualToString:@"mainimage"])
self.currentProduct.name = self.currentElementContent;
self.currentElementContent = nil;
if ([elementName isEqualToString:@"name"])
self.currentProduct.name = self.currentElementContent;
self.currentElementContent = nil;
else if ([elementName isEqualToString:@"categoryimage"])
self.currentProduct.imageUrlString = [self.currentElementContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
self.currentElementContent = nil;
else if ([elementName isEqualToString:@"subcategoryimage"])
self.currentSubProduct.imageUrlString = self.currentElementContent;
self.currentElementContent = nil;
[self.currentProduct.subProducts addObject:self.currentSubProduct];
self.currentSubProduct = nil;
else if ([elementName isEqualToString:@"Category"])
[self.products addObject:self.currentProduct];
self.currentProduct = nil;
在视图控制器中,当我厌倦了获取 Main
元素的图像时,我只得到了 XML 的 Category
元素。
视图控制器
[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];
【问题讨论】:
我不熟悉 xml 解析,但是在 json 中,您在解析时会获取字典和数组。跟xml应该差不多吧。 你能建议任何参考链接如何在 iphone 中使用 json,因为我不知道它。 是的:***.com/questions/5813077/… ... 它比 xml 恕我直言更具可读性 你能详细描述一下你的问题吗 【参考方案1】:我认为您无法获取特定图像视图的特定图像。我认为您正在尝试分别获取 MainImage、CategoryImage 和 SubCategoryImage ..并尝试相应地使用它们。您可以在字典中重新格式化您的数据,如下所示
"mainimage":["image1","image2"], "categoryimage":["image1","image2"], "subcategoryimage":["image1","image2"]
您可以通过为您的 3 个类别使用 3 个 MutableArray 来实现上述目标。并按如下要求存储数据
- (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];
然后在didend
- (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;
我认为这是你想要的。如果想使用更多信息,你可以使用字典或类对象。
【讨论】:
是的,正是我所期望的......当我使用上面的代码时,我遇到了一个错误,应用程序被终止说*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
self.currentElementContent = nil;应该放在最后而不是 didEnd 函数中的第一行..更改它应该工作的代码..
我在调试时遇到相同错误的应用程序终止,我看到错误来自视图控制器代码,如上所示。我在上面的视图控制器中将self.xmlProductsResults = parser.products;
更改为self.xmlProductsResults = parser.mainimages;
,但应用程序仍然被终止。【参考方案2】:
当您在 didEndElement 中遇到 mainimage
元素时,您必须为 self.currentProduct.imageUrlString
赋值
即
if([elementName isEqualToString:@"mainimage"])
self.currentProduct.imageUrlString=self.currentElementContent;;
【讨论】:
我尝试了您的代码,但仍然只能在视图控制器中获取Category
元素。我是否需要更改视图控制器中的任何内容以获取 Main
元素【参考方案3】:
对于这种情况,我更喜欢更简单的 XML 解析器 看看这个 http://vuknikolic.wordpress.com/2012/04/27/super-easy-ios-xml-parsing/
【讨论】:
【参考方案4】:@Ravindra 给了你正确的答案,你需要以数组或其他方式管理你的数据。
还有self.currentProduct.name = self.currentElementContent;
此行替换您的主要图像数据。
所以最好使用字典结构
【讨论】:
以上是关于如何在解析后获取xml文件的元素并在iPhone程序中对其进行验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QTreeWidget 中获取 XML 元素的 ID 并将新元素插入其中