2015-04-12 17 views
0

我正在處理一個應用程序,我在UITableView中使用XML解析。我無法弄清楚我是如何分別分析屬性rok1rok2。如果我使用[_element isEqualToString: @ "jmeno"]的應用程序效果不錯,但是它在UITableViewrok1rok2之間顯示給我,並且不想要它。 Thx爲您提供幫助。Objective-C - 如何分別解析XML的屬性?

還有就是我的解析器代碼:

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

    self.element = elementName; 

    if ([_element isEqualToString:@"rok1"]) 
    { 
     _item = [[NSMutableDictionary alloc] init]; 
     self.nazev = [[NSMutableString alloc] init]; 
     self.definice = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if ([self.element isEqualToString:@"nazev"]) 
    { 
     [self.nazev appendString:string]; 
    } 
    else if ([self.element isEqualToString:@"def"]) 
    { 
     [self.definice appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"rok1"]) 
     { 
     Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev 
               definice:self.definice]; 
     [self.svatkyArray addObject:thisSvatek]; 
    } 
    self.element = nil; 
} 

而且比如我的XML:

<?xml version="1.0" encoding="UTF-8" ?> 
<menu> 
    <rok1> 
     <jmeno> 
     <nazev>Prvni</nazev> 
     <def>blblbla</def> 
     <jmeno> 
     <nazev>Druhy</nazev> 
     <def>blbablabal</def> 
     </jmeno> 
    </rok1> 
    <rok2> 
     <jmeno> 
     <nazev>Prvni</nazev> 
     <def>blblbla</def> 
     </jmeno> 
    </rok2> 
</menu> 
+0

你怎麼想顯示的數據?分兩節?忽略rok2? – Paulw11

+0

我的想法是,我想顯示(例如在點擊UIButton之後)僅來自rok1或僅來自rok2的數據。我希望你能理解我。 – Alien

回答

1

你需要保持你的「狀態」的軌道,你是解析XML文檔。一種簡單的方法是簡單地添加一個布爾屬性,表明您正在處理目標元素「內部」。

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

    self.element = elementName; 

    if ([elementName isEqualToString:@"rok1"]) 
    { 
     self.foundTarget=YES; 
     self.nazev = [[NSMutableString alloc] init]; 
     self.definice = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if (self.foundTarget) { 
     if ([self.element isEqualToString:@"nazev"]) 
     { 
      [self.nazev appendString:string]; 
     } 
     else if ([self.element isEqualToString:@"def"]) 
     { 
      [self.definice appendString:string]; 
     } 
    } 
} 

- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"rok1"]) 
    { 
     Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev 
               definice:self.definice]; 
     [self.svatkyArray addObject:thisSvatek]; 
     self.foundTarget=NO; 
    } 
    self.element = nil; 
} 

一個更復雜的方法是建立某種形式的數據結構,如字典,代表您的XML

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

    self.element = elementName; 

    if ([elementName isEqualToString:@"rok1"] || [elementName.isEqualToString:@"rok2"]) 
    { 
     self.nazev = [[NSMutableString alloc] init]; 
     self.definice = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
     if ([self.element isEqualToString:@"nazev"]) 
     { 
      [self.nazev appendString:string]; 
     } 
     else if ([self.element isEqualToString:@"def"]) 
     { 
      [self.definice appendString:string]; 
     } 
} 

- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"rok1"] || [elementName.isEqualToString:@"rok2"]) 
     Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev 
               definice:self.definice]; 
     self.rokDictionary[elementName]=thisSvatek; // self.rokDictionary is an NSMutableDictionary 
    } 
    self.element = nil; 
} 

分離出各種「jmeno」標籤,你需要處理他們didStartElement & didEndElement -

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

    self.element = elementName; 

    if ([elementName isEqualToString:@"rok1"] || [elementName.isEqualToString:@"rok2"]) 
    { 
     self.jmenoArray=[NSMutableArray new]; 
    } 
    else if ([elementName isEqualToString:@"jmeno"]) { 
     self.nazev = [[NSMutableString alloc] init]; 
     self.definice = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
     if ([self.element isEqualToString:@"nazev"]) 
     { 
      [self.nazev appendString:string]; 
     } 
     else if ([self.element isEqualToString:@"def"]) 
     { 
      [self.definice appendString:string]; 
     } 
} 

- (void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"jmeno"]) { 
     Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev 
               definice:self.definice]; 
     [self.jemnoArray addObject:thisSvatek]; 
    } 
    else if ([elementName isEqualToString:@"rok1"] || [elementName.isEqualToString:@"rok2"]) 

     self.rokDictionary[elementName]=self.jmenoArray; // self.rokDictionary is an NSMutableDictionary 
     self.jmenoArray=nil; 
    } 
    self.element = nil; 
} 
+0

嗨,感謝您的建議,但是如果您使用您的代碼,則整個內容(來自rok1)將顯示在UITableView中的一個Cell中。可能因爲它被忽略屬性 Alien

+1

是的,因爲這就是你的原始代碼所做的。如果你想要不同的東西,那麼你需要在didStartElement/didEndElement中處理它。可能在'didStartElement'中爲分配了一個新的NSMutableArray,並在'didEndElement'中爲字符串添加了字符串,並將該數組添加到'didEndElement'中的字典中 Paulw11

+0

好吧,但這實際上是我最大的問題,不解決(抱歉,但我仍然是一個新手):-) – Alien