Какой тест нужно поставить чтобы получить вложенный элемент

Здесь случай, название существует в двух случаях, до и после 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, я хочу знать, возможно ли это в чистом виде NSXMLParserDelegate?

1 ответ

Решение

Вы должны отслеживать, находится ли парсер в данный момент внутри entry элемент или нет. Например, вы можете добавить целочисленное свойство entryLevel к классу, установите его изначально в ноль и обновите его в didStartElementа также 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--;
    }
}
Другие вопросы по тегам