0

我需要在这种 xml 中解析多个元素(id1 和 id2):

<name>
    <id1>104634449</id2>
    <id2>22014870</id2>
</name>
<name>
    <id1>104634433</id2>
    <id2>220143210</id2>
</name>

我使用这样的代码:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    isName = [elementName isEqualToString:@"name"];
    isId1 = [elementName isEqualToString:@"id1"];
    isId2 = [elementName isEqualToString:@"id2"];    
    if(isName){
        name = [Name new];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if (isName){
            [names addObject:name];
        }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (isId1){
        [name setId1:string];
    }
    if (isId2){
        [name setId2:string];
    }
}

但是对象名称中只设置了一个元素(id1 或 id2)。我做错了什么?

在调试中我得到这个: id1 = @"\n" id2 = @"22014870"

4

2 回答 2

0

在深入了解 XML 解析之前,我强烈建议您使用GDataXMLNode(也可作为 CocoaPod 使用)

然后,要了解如何使用它,请查看本教程How To Read and Write XML Documents with GDataXML

我知道这并不能直接回答您的问题,但是使用 Google 提供的这个库确实要简单得多。

于 2013-01-09T19:37:50.813 回答
0

问题是当你读完 id2 isName 设置为 NO,所以你并没有真正将它添加到你的数组中。

这是操作的顺序:

  1. name 元素开始;
  2. id1 元素开始;
  3. id1 元素结束;
  4. id2 元素开始;
  5. id2 元素结束;
  6. 名称元素结束。

在第 4 点发生了 isName 的最后一次赋值,设置为:

isName = [elementName isEqualToString:@"name"];

这将导致错误。

更正后的代码

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if ([elementName isEqualToString: @"name"){
            [names addObject:name];
        }
}
于 2013-01-09T19:50:05.660 回答