2012-06-10 52 views
0

我剛剛在NSXMLParser上做了一個教程。我完全不知所措的是NSXMLParser如何區分不同的元素。對我來說似乎沒有定義。NSXMLParser如何區分不同的元素?

這是我的XML

<?xml version="1.0" encoding="UTF-8"?> 
<Prices> 
<Price id="1"> 
<name>Rosie O'Gradas</name> 
<Beer>4.50</Beer> 
<Cider>4.50</Cider> 
<Guinness>4</Guinness> 
</Price> 
</Prices> 

這是我的解析器

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
if ([elementName isEqualToString:@"Prices"]) { 
    app.listArray = [[NSMutableArray alloc] init]; 
    NSLog(@"The Prices Count"); 
} 
else if ([elementName isEqualToString:@"Price"]) { 
    thelist = [[List alloc] init]; 
    thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue]; 
} 
} 

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
if (!currentElementValue) { 
    currentElementValue = [[NSMutableString alloc]initWithString:string]; 

} else { 
    [currentElementValue appendString:string]; 
} 

} 

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
if ([elementName isEqualToString:@"Prices"]) { 
    return; 
} 
if ([elementName isEqualToString:@"Price"]) { 
    [app.listArray addObject:thelist]; 
    thelist = nil; 

} else { 
    [thelist setValue:currentElementValue forKey:elementName]; 
    currentElementValue = nil; 
} 
} 

我也注意到,在屬性中的數據對象的名字是一樣的解析器。所以我至少明白這一點。

我很茫然,它將這些屬性賦值給它。

因此,在開始的時候初始化與

 thelist = [[List alloc] init]; 

數據對象(名單是數據對象),但後來它,我不明白

 thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue]; 

因爲它的第一件事在if語句中,每次找到id屬性時都不會被覆蓋。或者是'theList'聲明創建多個對象?

在發現的字符我真的不知道發生了什麼。儘可能多的我可以告訴foundCharaters字符串是元素內部的每一點文本。所以當前的元素值實際上只是附加在一起的一串字符串(但由於某種原因,我無法說出我不能NSLOG它)。

從那裏的didEndElement部分,我不知道這是否是代碼的正確解釋。

if ([elementName isEqualToString:@"Price"]) { 
    [app.listArray addObject:thelist]; 
    thelist = nil; 
    } 

據我所知,每個解析器撞擊元件價格該app.list數組對象(在另一個類中聲明)時間具有對象添加到它的thelist'。

但這裏是位在那裏我缺乏在以前方法的理解生效

else { 
    [thelist setValue:currentElementValue forKey:elementName]; 
    currentElementValue = nil; 
} 

他們在這裏做什麼?從我看到的當前元素值僅僅是來自XML文件的混亂字符。它是如何組織的?元素名稱?

還有一個問題(抱歉的長度)爲什麼不是元素名稱區分大小寫,我正在試驗,我發現它不是。這兩種語言都區分大小寫。

+0

面向對象編程的目的是爲了隱藏你的對象所做的事情,如果你有第三方對象,那麼我們只是使用它們:)從不懷疑它大聲笑...唯一的原因不要質疑,因爲每個人都會有不同的已經在NSXMLParser中完成的實現思路。 – doNotCheckMyBlog

+0

我想我需要知道這裏發生了什麼。特別是currentElementValue部分 – Brockman

回答

0

如果我正確解釋你的問題,它只是瞭解正在工作的代碼。

在你的XML你有4個元素Priceid=1nameBeerCiderGuinness

foundCharacters方法將在內找到這些4 xml標籤,即什麼是<name></name><Beer></Beer>等之間的書面在你的情況下,這name字符串Rosie O'Gradas,然後Beer

字符時發現,該方法首先,如果檢查字符串4.50容器字符串存在,如果不存在,則創建一個爲currentElementValue。如果它確實存在,它追加找到的字符。

接下來會發生什麼,邏輯?它會碰到didEndElement方法,在第一種情況下,標籤</name>。在這種情況下,它會將currentElementValue中收集的文本分配給密鑰@"name",並將此鍵值對放入列表中。該列表的類型爲List,其定義在其他地方,但它似乎本質上是NSDictionary

由於currentElementValue已成功存儲,因此應該銷燬,因此下次檢查其存在時是否存在foundCharacters將起作用。

清除?

相關問題