0

在这种情况下,标题出现在两次出现之前和之后entry

<feed xmlns:im="http://xxx.com/rss" xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <id>http://xxxxx/xml</id><title>xxxxx: Top articles</title><updated>2013-07-20T04:30:05-07:00</updated><link rel="alternate" type="text/html" href="https://xxxx;popId=1"/><link rel="self" href="http://xxxxxxx/xml"/><icon>http://xxxxxxxxxxx</icon><author><name>xxxxxxx</name><uri>http://www.xxxxx.com/xxxxx/</uri></author><rights>Copyright 2001</rights>

        <entry>
            <updated>2013-07-20T04:30:05-07:00</updated>

                <id im:id="621507457">https://xxxxx.xxxx.com/us/album/blurred-lines-feat.-t.i.-pharrell/id621507456?i=621507457&amp;uo=2</id>
                 //I want to get only the title nested in entry tree
                <title>Robin Thicke</title>

应该在didStartElement:协议方法中进行什么测试以逃避任何外部<entry></entry>

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

    if ([elementName isEqualToString:@"title"]) {
      //This is not enough, since it bring also the title value which is outside the entry tree
    }
}

我不想依赖像 TBXML 这样的外部库,我想知道这在 pure 中是否可行NSXMLParserDelegate

4

1 回答 1

0

您必须跟踪解析器当前是否在entry元素“内部”。例如,您可以entryLevel向该类添加一个整数属性,将其初始设置为零并在didStartElement and中更新它didEndElement

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"entry"]) {
        self.entryLevel++;
    } else if ([elementName isEqualToString:@"title"] && self.entryLevel > 0) {
        // title inside entry
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"entry"]) {
        self.entryLevel--;
    }
}
于 2013-07-20T15:29:31.033 回答