2013-07-31 35 views
1

我想解析URL中的一些XML数据。它几乎可以工作,但预期的数据没有被记录。NSXMLParser无法正常工作

这里是XML数据

<?xml version="1.0" encoding="utf-8"?> <result> 
<row> 
<id>1</id> 
<menu_id>1</menu_id> 
<group_id>1</group_id> 
<name>Merchandise</name> 
<image>bag of beans.jpg</image> 
</row> 
<row> 
<id>4</id> 
<menu_id>1</menu_id> 
<group_id>1</group_id> 
<name>Misc</name> 
<image>tea.jpg</image> 
</row> 

这里的样本是我的代码:

#pragma mark - NSXMLParserDelegate 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    // If you have a more complex object you could init here 
    // Since I'm just storing a string I won't do anything 
    if ([elementName isEqualToString:@"name"]) { 
    // NSLog(@"didStartElement - %@", elementName); 
    } 
    } 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (!self->currentStringValue) { 
    self->currentStringValue = [[NSMutableString alloc] init]; 
    // NSLog(@"didStartElement - %@", string); 

    } 


    [self->currentStringValue appendString:string]; 
} 

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

     NSString *currentStringValue = [self->currentStringValue 
           stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    self->currentStringValue = nil; 

    if ([elementName isEqualToString:@"name"]) { 
      self->ourExpectedElementValue = currentStringValue; 
      NSLog(@"%@",currentStringValue); 
     } 
    } 

正如你可以在XML数据看,有不止一个“名称”元素与3日至最后一行读取

NSLog(@"%@",currentStringValue); 

意味着所有的<name> TA内登录的所有值GS,而是它仅记录本:

2013-07-31 19:02:56.394 Touch2Go[1775:11303] Merchandise 
+0

我无法重现您的问题。代码记录“商品”和“杂项”。为了避免解析器错误,我将缺少的''添加到XML数据中。 –

+0

但是没有标签。这是问题吗? – AndroidDev

+0

你在第一行有一个起始''标签。是的,没有它不会奏效。 –

回答

1

正如在讨论横空出世,XML数据没有一个单一的顶级元素 所要求的XML规范,所以它看起来像这个:

<row> 
    ... 
</row> 
<row> 
    ... 
</row> 
<row> 
    ... 
</row> 

解析器在第一个完整的“行”标记(并返回一个错误条件)后停止解析。如果数据包含在单个顶级元素中,则所有元素都按预期进行解析。

0

你必须采取数组。当它从xml中获取字符串时,您必须在didEndElement方法中将其添加到数组中。

+0

请问你能否在代码中表明,然后我会+1 – AndroidDev