2011-02-07 46 views
0

こんにちは、私はxmlファイルの21の要素を持っていて、それらを可変配列に追加したいのですが、本当に奇妙な問題があります。パーサー11回の開始要素、11回のfoundCharactersですが、それはxmlファイルを終了するように振る舞います。私のプログラムは、run.Butのように落ちたり動かされたりすることはありません。 なぜですか?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; 
    } 
} 

私はそれが役に立てば幸い、私は問題を探す必要があります少なくとも1つのキー おかげ

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文書はどの言語ですか? –

+0

ok私はutf-8でそれを持っています。私はここから自分のコードから何を貼り付けますか? – Csabi

+0

問題のあるXMLコードを表示 –

答えて

0

OK、これは、 CDATAかもしれない。もしあなたがCDATAを持っているタグを持っていれば、その機能を通してCDataが解析されます。

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

これをチェックしてください。

+0

私はtransidでそれをチェックしますが、なぜそれが10回働くのか理解していません – Csabi

+0

あなたのタグの10はCDATAブロックではなく、 CDAtaブロック –

+0

xmlファイルのサイズが40 KBで、それが最初に8 Kbになると、バッファが大きくなり、関数が2回実行されたときにcorectlyで動作する40が得られますが、これを行うことはできません。Can私はどこかでバッファを大きくして8 kbに変更しますか? – Csabi

関連する問題