iOS NSXMLParser值,具有类别ie。<;产品类别=";ABC"&燃气轮机;在表视图中

iOS NSXMLParser值,具有类别ie。<;产品类别=";ABC"&燃气轮机;在表视图中,ios,xml,xml-parsing,tableview,xcode4.5,Ios,Xml,Xml Parsing,Tableview,Xcode4.5,我有一个XML,它将表示一个产品目录,其中每个产品都属于一个类别。即: <Product category="ABC"> <Item_number>123</Item_number> </Product> <Product category="ABC"> <Item_number>456</Item_number> </Product> <Product category="XYZ"&g

我有一个XML,它将表示一个产品目录,其中每个产品都属于一个类别。即:

<Product category="ABC">
 <Item_number>123</Item_number>
</Product>

<Product category="ABC">
 <Item_number>456</Item_number>
</Product>

<Product category="XYZ">
 <Item_number>789</Item_number>
</Product>
详图表视图(选定的“ABC”):

(1) 最好的方法是什么

(2) 我想我的第一个障碍是解析类别“ABC”中的值

(3) 第二个问题是如何存储数据(或者我可以保持相同的方法*),其中用户可以从第一个页面中选择单个类别来引用DetailTableView页面


didStartElement的当前实现

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
        if ( [elementName isEqualToString:@"Product"] ){
            self.currentProduct = [[Product alloc] init];
            self.storeCharacters = NO;
        } else  if ([elementName isEqualToString:@"Item_Number"]) {
            [self.currentString setString:@""];
            self.storeCharacters = YES;
        }
    }

关于解析
类别
,当
elementName
@“产品”
时,将从
属性
字典中检索该类别

就“最佳方法”而言,您只需要决定您的数据结构。我可能建议构建一个NSMutableArray,它是一个类别字典条目数组,每个类别一个,字典中的一个对象是该类别中的一个产品数组

一旦你有了这样的结构,回答你的第三个问题可能是显而易见的


首先,您的XML确实需要一个外部标记,例如:

<Products>
    <Product category="ABC">
        <Item_number>123</Item_number>
        <Description>Coffee table</Description>
    </Product>

    <Product category="ABC">
        <Item_number>456</Item_number>
        <Description>Lamp shade</Description>
    </Product>

    <Product category="XYZ">
        <Item_number>789</Item_number>
        <Description>Orange chair</Description>
    </Product>
</Products>
然后,
NSXMLParserDelegate
方法可能如下所示:

#pragma标记-NSXMLParser委托方法
-(void)parserdistartdocument:(NSXMLParser*)解析器
{
self.categories=[NSMutableArray];
}
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName属性:(NSDictionary*)attributeDict
{
NSArray*子元素名称=@[@“项目编号”,“说明”];
if([elementName IsequalString:@“Product”])
{
//获取类别属性的名称
NSString*categoryName=[attributeDict objectForKey:@“category”];
NSAssert(类别名称,@“未找到类别”);
//搜索我们的Categories字典数组,看看是否有一个名称等于categoryName的字典
__块NSMutableDictionary*parserCurrentCategory=nil;
[self.categories EnumerateObjectsSusingBlock:^(id obj,整数idx,布尔*停止){
if([categoryName IsequalString:[obj objectForKey:@“name”]]))
{
parserCurrentCategory=obj;
*停止=是;
}
}];
//如果我们没有找到一个,那么让我们创建一个,并将其添加到我们的cateogires数组中
如果(!parserCurrentCategory)
{
parserCurrentCategory=[NSMutableDictionary Dictionary WithObjectsAndKeys:
类别名称,@“名称”,
[NSMutableArray],@“项目”,
零];
[self.categories addObject:parserCurrentCategory];
}
//现在,让我们为要添加的产品向items数组添加一个条目
self.parserProduct=[NSMutableDictionary];
[[parserCurrentCategory objectForKey:@“items”]addObject:self.parserProduct];
}
else if([子元素名称包含对象:元素名称])
{
self.parseRelationValue=[NSMutableString];
[self.parserProduct setObject:self.parsererementvalue-forKey:elementName];
}
}
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串
{
if(self.parseRelationValue)
[self.parseRelationValue appendString:string];
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
{
if([elementName IsequalString:@“Product”])
{
self.parserProduct=nil;
}
else if(self.parseRelationValue)
{
self.parseRelationValue=nil;
}
}
-(void)parserDidEndDocument:(NSXMLParser*)解析器
{
//所有这些都完成了,做任何你想做的事情,就像为你的表重新加载数据一样
NSLog(@“%s categories=%@”,“函数”,“self.categories”);
}
-(void)解析器:(NSXMLParser*)解析器解析错误发生:(NSError*)解析错误
{
NSLog(@“%s error=%@”,“函数”,“语法错误”);
}

对不起-脱光了衣服。我现在修复了Q#2。谢天谢地把我的简历贴在了我的帖子上。像那样?如果是这样的话,我现在得到的是产品的空白tho:(@Tim_User1904669显然,你已经包括了
didStartElement
,但是没有显示
foundCharacters
,产品id将在哪里构造,也没有显示
didEndElement
产品id将在哪里保存,所以我不可能说。但是请看我更新后的答案,了解另一种方法。天哪,你太棒了!它工作起来像魅力!!感谢你的所有努力。我可以从日志中看到,它已将每个类别的项目分解。现在,超级有趣的部分…将它们放入表格视图中。我可以只使用类别来完成主要部分,但细节部分可能是一个挑战。我将看看是否可以找到相关的教程。再次感谢!你太棒了!!Whoops抱歉地问。如果我的产品中除了项目编号之外还有更多元素,该怎么办?我是否需要创建另一个临时变量(即NSMutableString*parserCurrentProductName)在NSXMLParserDelegate方法中它会是什么样子?谢谢!工作起来很有魅力。只是为了让我理解你的设计,这样我才能真正学习和消化。你创建了一个类别的可变数组,在其中,你有一个项目数组。每个项目都有组成单个项目的不同子元素。我是不是在ri上ght track?我以前从未使用过字典,除了在一个教程中,我在plist中创建了一个字典并从中阅读。~很抱歉我是一个新手。Objective C(显然)对我来说是新的。我以前用Java:D编写代码
    <Product category="ABC">
cell.textLabel.text = product.product;
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
        if ( [elementName isEqualToString:@"Product"] ){
            self.currentProduct = [[Product alloc] init];
            self.storeCharacters = NO;
        } else  if ([elementName isEqualToString:@"Item_Number"]) {
            [self.currentString setString:@""];
            self.storeCharacters = YES;
        }
    }
<Products>
    <Product category="ABC">
        <Item_number>123</Item_number>
        <Description>Coffee table</Description>
    </Product>

    <Product category="ABC">
        <Item_number>456</Item_number>
        <Description>Lamp shade</Description>
    </Product>

    <Product category="XYZ">
        <Item_number>789</Item_number>
        <Description>Orange chair</Description>
    </Product>
</Products>