2011-02-07 47 views
0

嗨我有一個非常奇怪的問題我有xml文件惠特21個元素,我想將它們添加到可變數組。分析器11次啓動元素,11次foundCharacters但只有10次結束元素它的行爲就像它結束了xml文件一樣。我的程序不會崩潰,它應該運行,但它有時會使它讀取所有21個元素。 爲什麼?NsXmlParser不能正常工作

我的一些代碼部分:

/*this function start work whith xml file*/ 

- (void)parseXMLFile:(NSData *)adatok { 
    if (adatok != nil) { 
     BOOL success; 
     if (addressParser) 
      [addressParser release]; 
     addressParser = [[NSXMLParser alloc] initWithData:adatok]; 
     [addressParser setDelegate:self]; 
     [addressParser setShouldResolveExternalEntities:YES]; 
     success = [addressParser parse]; 

    } 
} 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    NSLog(elementName); 
    if ([elementName isEqualToString:@"turnover"]) { 
     objektObrat =[[Obrat1 alloc] init]; 
     NSString *sth = [attributeDict objectForKey:@"transid"]; 
     objektObrat.uID = sth; 
    } 
    if ([elementName isEqualToString:@"amount"]) { 
     osuma=YES; 
    } 
} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
//filling the object which will be saved in database  
    NSLog(string); 
    if (osuma) { 
     osuma=NO; 
     objektObrat.suma = [[NSString alloc] initWithString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    NSLog(elementName); 
    if ([elementName isEqualToString:@"turnover"]) { 
     turnOver = NO; 
     oid = NO; 

     if (objektObrat != Nil){ 
      [obratDatabaseArray addObject:objektObrat]; 
      [objektObrat release]; 
     } 
     //add to array 
     [array addObject:vypisObratString]; 
    } 

    if ([elementName isEqualToString:@"amount"]) { 
     osuma=NO; 
    } 
} 

我希望它能幫助,至少有一個關鍵,我應該尋找問題 感謝

XML

<!ELEMENT turnovers (turnover*)> 
<!ELEMENT turnover (amount, maturity-date, trans-date, counter-prefix, counter-account, counter-bank, counter-name, constant-symb, variable-symb, spec-symb, description, note, type, storno, rate, balance, currency, statement, message1, message2)> - detail obratu 
<!ATTLIST turnover transid CDATA #REQUIRED> 
<!ELEMENT amount (#PCDATA)> - suma 
<!ELEMENT maturity-date (#PCDATA)> - dátum operácie 
<!ELEMENT trans-date (#PCDATA)> - dátum transakcie 
<!ELEMENT counter-prefix (#PCDATA)> - predčíslo protiúčtu 
<!ELEMENT counter-account (#PCDATA)> - číslo protiúčtu 
<!ELEMENT counter-bank (#PCDATA)> - kód banky 
<!ELEMENT counter-name (#PCDATA)> - názov protiúčtu 
<!ELEMENT constant-symb (#PCDATA)> - konštantný symbol 
<!ELEMENT variable-symbol (#PCDATA)> - variabilný symbol 
<!ELEMENT spec-symb (#PCDATA)> - špecifický symbol 
<!ELEMENT constant-symb (#PCDATA)> - konštantný symbol 
<!ELEMENT note (#PCDATA)> - poznamka 
<!ELEMENT type (#PCDATA)> - typ obratu pozri číselník typy obratov v prílohe č. 1). 
<!ELEMENT storno (#PCDATA)> - či je storno 
<!ELEMENT rate (#PCDATA)> - kurz 
<!ELEMENT balance (#PCDATA)> - zostatok 
<!ELEMENT currency (#PCDATA)> - mena 
<!ELEMENT statement (#PCDATA)> - číslo výpisu 
<!ELEMENT message1 (#PCDATA)> - message 1 
<!ELEMENT message2 (#PCDATA> - message 2 
+0

更多相關代碼將有所幫助。另外,你的XML文檔是用什麼語言編寫的? – 2011-02-07 11:57:28

+0

好的我在utf-8中使用它,我應該從代碼中粘貼什麼? – Csabi 2011-02-07 12:06:15

回答

0

好吧,這可能是CDATA。它如果有一個有CDATA則CData通過功能

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock 

檢查了這一點解析的標籤。