Какой тест нужно поставить чтобы получить вложенный элемент
Здесь случай, название существует в двух случаях, до и после 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&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--;
}
}