2011-04-07 30 views
2

解析XML,我有以下XML:如何使用的NSXMLParser

<?xml version="1.0" encoding="UTF-8"?> 
<Message> 
    <Text>Town park travel</Text> 
    <Theme>Ready for racing?</Theme> 
    <Activate_date>2011-03-08</Activate_date> 
    <Login>Simon</Login> 
    <Name>Simon </Name> 
    <Longitude>46.00339</Longitude> 
    <Latitude>51.515381</Latitude> 
</Message> 

我怎樣才能得到元素要的NSMutableDictionary?

我試圖

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    
if ([elementName isEqualToString:@"Message"]){ 
    listOfFriends = [[NSMutableDictionary alloc] init]; 
    if ([elementName isEqualToString:@"text"]) { 
     [listOfFriends setObject: elementName forKey @"text" ]; 
    } 
    } 

但它是錯誤的

現在我用同一代碼:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    
if ([elementName isEqualToString:@"Message"]){ 
    listOfFriends = [[NSMutableDictionary alloc] init]; 
} else if ([elementName isEqualToString:@"Text"] || [elementName isEqualToString:@"Theme"] || [elementName isEqualToString:@"Activate_date"] || [elementName isEqualToString:@"Login"] || [elementName isEqualToString:@"Longitude"] || [elementName isEqualToString:@"Latitude"]) { 
    [currentElement setString:@""]; 
    storingCharacters = YES; 
} 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
if ([elementName isEqualToString:@"Message"]) { 
    [listOfFriends release]; 
} else if ([elementName isEqualToString:@"Text"]) { 
    txt.text = currentElement; 
} else if ([elementName isEqualToString:@"Theme"]) { 
    theme.text = currentElement; 
} else if ([elementName isEqualToString:@"Activate_date"]) { 
    aDate.text = currentElement; 
} else if ([elementName isEqualToString:@"Login"]) { 
    autor.text = currentElement; 
} 
storingCharacters = NO; 
} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
if (storingCharacters) [currentElement appendString:string]; 
} 

但我對視空標貼...

+1

你試過了什麼代碼?你究竟在哪裏遇到麻煩? SO反對「給我代碼」職位。 – Amy 2011-04-07 04:37:00

+0

我不明白如何添加到NSMutableDictionary元素 – Ruslan 2011-04-07 04:49:38

+0

到目前爲止您嘗試過的並不完美,但這是一個好的開始。但是,您需要實現更多的NSXMLParserDelegate方法,並使listOfFriends屬性成爲可能。 – 2011-04-07 04:56:05

回答

5

的NSXMLParser是基於流的,並且在遇到XML流中的特定組件時將各種消息發送給它的委託 - 開始標籤,文本,結束標籤等。因此,創建一個NSXMLParser的實例,併爲其分配一個符合NSXMLParserDelegate協議的代理。 (編輯:從您添加到您問題的代碼,它看起來像你可能已經這樣做了一部分,或者它至少取得了良好的開端

在您委託類-parser:didStartElement:...方法,檢查元素名稱。如果是「消息」,則創建一個新的NSMutableDictionary來將信息保存在其子元素中,並將其存儲在一個屬性中:(編輯:在您的代碼中,它看起來像是聲明瞭實例變量,但應該使用點-syntax訪問它的屬性,以確保正確的內存管理情況。

self.listOfFriends = [NSMutableDictionary dictionary]; 

對於其他元素名稱,創建將用於包含文本空的NSMutableString,並存儲在屬性:

self.thisString = [NSMutableString string]; 

在您的-parser:foundCharacters:方法中,將字符串追加到mutable你之前創建的字符串屬性。

[self.thisString appendString:string]; 

最後,在您的-parser:didEndElement:...方法中,檢查元素名稱。如果它是「消息」,則完成此消息元素。如果您的XML流只有一個Message元素(如示例中所示),那麼現在可以打印您構建的字典,或者您想要使用的任何其他字符。如果可以有多個Message元素,則可以將剛剛完成的元素添加到數組中。

如果剛剛結束的元素是消息,其與-setValue:forKey:傳遞元素名稱作爲鍵添加到字典中,和您在早些時候接受-parser:foundCharacters:消息作爲價值創造的建成字符串。

[self.listOfFriends setValue:self.thisString forKey:elementName];