使用NSXMLParser解析XML属性

时间:2013-01-07 11:54:15

标签: xcode uitableview attributes nsxmlparser

我正在搜索从这个简化的xml文件的N个标签中解析所有属性“unit1”和“unit2”,然后将它们放在UITableView中:

<xml>
<meta></meta>
<time1>
<product>
<value1 id="id1Time1" unit1="unit1Time1" number1="number1Time1"/>
<value2 id="id2Time1" unit2="unit2Time1" number2="number2Time1"/>
</product>
</time1>
<time2>
<product>
<value1 id="id1Time2" unit1="unit1Time2" number1="number1Time2"/>
<value2 id="id2Time2" unit2="unit2Time2" number2="number2Time2"/>
</product>
</time2>
...
<timeN>
<product>
<value1 id="id1TimeN" unit1="unit1TimeN" number1="number1TimeN"/>
<value2 id="id2TimeN" unit2="unit2TimeN" number2="number2TimeN"/>
</product>
</timeN>
</xml>

我正在使用NSXMLParser,自我委托,而且我正在使用此代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    currentElement = [elementName copy];
    if ([elementName isEqualToString:@"value1"]) {
        arrayUnit1 = [[NSMutableArray alloc] init]; 
        stringUnit1 = [attributeDict objectForKey:@"unit1"];
        [arrayUnit1 addObject:stringUnit1];
    }
    if
        ([elementName isEqualToString:@"value2"]) {
        arrayUnit2 = [[NSMutableArray alloc] init];
        stringUnit2 = [attributeDict objectForKey:@"unit2"];
        [arrayUnit2 addObject:stringUnit2];
    }
}

使用value1和value2填充UITableView我正在使用:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [arrayUnit1 count]; // <--- I Know, here is the problem!
}

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:
                UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%@",[arrayUnit1 objectAtIndex:indexPath.row]];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[arrayUnit2 objectAtIndex:indexPath.row]];

    return cell;
}

好吧,解析是完美的,我也可以NSLog每N个stringValues但是在我的UITableView中我只能看到一行具有arrayUnit N的最后一个值(在这个例子中是unit1TimeN和unit2TimeN)。那么如何用每个值填充表格,我的数组的所有N值?也许我还需要实现 - (void)解析器:(NSXMLParser *)解析器didEndElement:?谢谢!

2 个答案:

答案 0 :(得分:1)

从此处删除此行

  

arrayUnit1 = [[NSMutableArray alloc] init];

并在分配解析器时将其放在其他位置。 这是删除数组的所有先前元素并为其分配新内存,因此您只会看到添加的最后一个元素..

答案 1 :(得分:0)

您正在每个已解析的元素上重新分配一个新数组,只需分配一次数组:

if (!arrayUnit1)
   arrayUnit1 = [[NSMutableArray alloc] init];