2011-02-07 6 views
0

Salut j'ai un problème vraiment étrange j'ai fichier xml whit 21 éléments et je veux les ajouter au tableau mutable.Et l'analyseur 11 fois élément de départ, 11 fois foundCharacters mais seulement 10 fois la fin de l'élément et il se comporte comme il finit le dossier de xml. Mon programme ne tombe pas et ne fonctionne pas comme il devrait fonctionner. Mais quelquefois il fait ce qu'il devrait ainsi il lise tous les 21 éléments. Pourquoi?NsXmlParser ne fonctionne pas correctement

une partie de mon code:

/*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; 
    } 
} 

J'espère que cela aide, au moins une clé où je devrais chercher le problème Merci

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

Plus de code associé aiderait. De plus, dans quelle langue se trouve votre document XML? –

+0

ok je l'ai dans utf-8 et que dois-je coller ici à partir de mon code? – Csabi

+0

Afficher le code XML en difficulté –

Répondre

0

Ok, il pourrait être un CDATA. Si vous avez une étiquette qui a CDATA puis CData est analysé par la fonction

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

Vérifiez cela.

+0

Je vais vérifier à transid mais je ne comprends pas pourquoi cela fonctionne 10 fois – Csabi

+0

Cela fonctionne parce que 10 de vos balises ne sont pas des blocs CDATA, et 1 d'entre eux est un bloc CDAta. –

+0

J'ai trouvé ce qui fait l'erreur pour moi mon fichier xml est de 40 Ko de large et il obtient d'abord 8 Ko puis il tourne son tampon plus gros et obtient 40 ça fonctionne corectly quand je cours ma fonction deux fois Mais je ne veux pas faire je quelque part changer le tampon plus gros que 8 kb? – Csabi

Questions connexes