NSXMLParser根据元素属性解析值

时间:2013-12-24 07:09:14

标签: objective-c nsxmlparser

我有XML样本:

<book id="bk101">
   <title>XML Developer's Guide</title>
</book>
<book id="bk102">
   <title>Midnight Rain</title>
</book>

如何输出ID为“bk101”的图书的标题值?

我的代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"book"])
    {
        NSString *codeValue = [attributeDict objectForKey:@"id"];

        if ([codeValue isEqualToString:@"bk101"]) {
            //NSLog(@"found"); // output book title here
        }
    }
}

1 个答案:

答案 0 :(得分:3)

假设结构XML(如示例标记中没有子元素且标记内的文本没有unicode或其他特殊字符。然后输出到控制台(例如)ID为“bk101”的书的“标题”值,你应该:

  1. codeValue声明为属性。

    @property (strong, nonatomic) NSString *codeValue;
    
  2. 更改您的代码如下:

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"book"])
        {
          _codeValue = [attributeDict objectForKey:@"id"];
        }
    }
    
  3. 添加如下所示的实施foundCharacters:方法:

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
      if ([_codeValue isEqualToString:@"bk101"]) 
      {
        NSLog(@"found: %@", string); // output book title here
      }
    }
    
  4. 添加如下所示的实施didEndElement:方法(有选择地针对并非所有标签“book”都具有属性的情况):

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
      if (_codeValue != nil) 
      {
        _codeValue = nil
      }
    }
    
  5. 注意:如果帖子开头指定的条件不同 - 您可能需要不同的实现。

    作为替代方案,您可以使用XMLConverter并转换您的XML(我做了一些更改):

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
      <book id="bk101">
        <title>XML Developer's Guide</title>
      </book>
      <book id="bk102">
        <title>Midnight Rain</title>
      </book>
    </books>
    

    NSDictionary,如下所示:

    2013-12-24 13:15:48.167 test[603:70b] {
        books =     {
            book =         (
                            {
                    "-id" = bk101;
                    title = "XML Developer's Guide";
                },
                            {
                    "-id" = bk102;
                    title = "Midnight Rain";
                }
            );
        };
    }
    

    并与之合作。