【问题标题】:Parsing XML using NSXML for iPhone使用 NSXML for iPhone 解析 XML
【发布时间】:2011-12-24 21:30:07
【问题描述】:

我有一个结构如下的 XML:

<data>
   <books>
      <item>
          <title>book1</title>
          <author>author1</author>
      </item> 
      <item>
          <title>book2</title>
          <author>author2</author>
      </item>
   </books>
   <magazines>
      <item>
          <title>Mag1</title>
          <author>author1</author>
      </item>
   </magazines>
   <journals>
      <item>
          <title>Journal1</title>
          <author>author1</author>
      </item> 
      <item>
          <title>Journal2</title>
          <author>author2</author>
      </item>
   </journals>
</data>

我正在使用表格视图来显示每个类别的项目。我计划有一个包含书籍、杂志和期刊栏的表格视图,点击它们应该只显示它​​们下面的项目。也就是说,如果我点击书籍,它应该只显示书籍条目。

我有这个用于 xml 解析

- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *) elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
    attributes:(NSDictionary *)attributeDict
{

    if ([elementName isEqual:@"books"]) {
        flag=1;
    }   

    if ([elementName isEqual:@"title"]) {   
        NSLog(@"found title!");
        parsedString = [[NSMutableString alloc] init];
    }
    if ([elementName isEqual:@"author"]) {  
        NSLog(@"description found");
        parsedString = [[NSMutableString alloc] init];
    }

}

- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    if (flag==1){   
    if ([elementName isEqual:@"title"]) {
        [headlines addObject:parseString];

        [parseString release];
        parseString = nil;
    }

    if ([elementName isEqual:@"author"]) {
        [authors addObject:parsedString];
        [parseString release];
        parseString = nil;
        flag=2;
        }
    }
}

但这只会得到书籍的第一个条目,没有其他内容。 除了设置标志之外,还有一种方法可以仅在 标签?

谢谢。

【问题讨论】:

    标签: objective-c ios4 nsxmlparser


    【解决方案1】:

    它只获得第一项的原因是当您看到作者标签的结束元素时,您将 flag 设置为 2。我怀疑如果你在书标签的末尾元素中更新这个标志,你会更接近你想要的,如下所示:

    - (void)parser:(NSXMLParser *)parser
     didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qName
    {
      if (flag==1){   
        if ([elementName isEqual:@"title"]) {
            [headlines addObject:parseString];
    
            [parseString release];
            parseString = nil;
        }
    
        if ([elementName isEqual:@"author"]) {
            [authors addObject:parsedString];
            [parseString release];
            parseString = nil;
        }
        if ([elementName isEqual:@"books"]) {
            flag=2;
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      只要书籍标签结束就取消解析:

      - (void)parser:(NSXMLParser *)parser
       didEndElement:(NSString *)elementName
        namespaceURI:(NSString *)namespaceURI
       qualifiedName:(NSString *)qName
      {  
          if ([elementName isEqual:@"books"]) {
              [parser abortParsing];
          }
      
          ....
      }
      

      【讨论】:

      • 此方法仅在您尝试获取书籍部分时才有效,该部分恰好位于 XML 中的第一个部分,如示例中所示。但是,如果您想应用相同的逻辑来检索“杂志”和“期刊”部分,那将无济于事。
      • 我现在试过了。单击后,我的表格视图中的单元格会进入一个显示作者姓名的屏幕。它工作正常,但是当我回到表格视图并再次单击该项目时,它崩溃了。基本上,我要做的是只解析书籍中的标签,只解析杂志中的标签等。所以,如果我解析杂志,它不应该解析书籍和期刊下的标签。
      • @RBK - 这是另一个可能与解析无关的问题。
      • @Max 我认为您所说的还有其他问题。但正如蒂姆所说,它只适用于书籍,不适用于其他。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多