2010-04-23 2 views
0

J'analyse cette ligne:je besoin d'aide pour déboguer mon analyse XML s'il vous plaît

<type>branch</type>

avec ce code dans didEndElement

if ([elementName isEqualToString:@"type"]) { 

     [currentBranchDictionary setValue:currentText forKey:currentElementName]; 

    } 

Lorsque je teste la valeur de la clé type, il ne contient pas branch mais contient à la place branch\n. Voici le test je joue:

if ([[currentBranchDictionary valueForKey:@"type"] isEqualToString:@"branch"]) { 
     NSLog(@"no new-line"); 
    } else if ([[currentBranchDictionary valueForKey:@"type"] isEqualToString:@"branch\n"]) { 
     NSLog(@"new-line"); 
    } 

cela renvoie la « nouvelle ligne » sortie

Voici la méthode foundCharacters:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    [currentText appendString:string]; 
} 

Je ne comprends pas où le retour chariot est ajouté, quelqu'un peut-il aider?

+0

Quelle méthode est le premier extrait de code? Montre la méthode foundCharacters. Dans quels autres endroits currentText est-il défini ou modifié? – DyingCactus

+0

Le premier extrait de code se trouve dans didEndElement. Je posterai la méthode des caractères trouvés, merci. – conorgriffin

+0

Je fais aussi 'currentText = [Chaîne NSMutableString];' dans 'didStartElement' – conorgriffin

Répondre

1

Je soupçonne que votre XML contient des retours chariot ("\ r") qui ne sont pas affichés par votre éditeur. La spécification XML requiert ceux-ci soient traduites en ligne flux (« \ n ») avant de signaler le résultat à votre demande:

http://www.w3.org/TR/REC-xml/#sec-line-ends

Pouvez-vous vérifier le contenu de votre fichier XML? Quelle est la sortie de la commande xxd? Voici la sortie d'un fichier que j'ai créé. Notez le caractère 0d supplémentaire:

0000000: 3c74 7970 653e 6272 616e 6368 0d3c 2f74 <type>branch.</t 
0000010: 7970 653e        ype> 
+0

Salut bkail, j'ai hand-tapé les lignes contenant ' branche' et ils font pas de retour chariot. Si je publie 'currentText' avant de placer son contenu dans le dictionnaire, il n'a pas de retour chariot. Si je génère le 'valueForKey: @" tapez "' immédiatement après l'avoir défini, il n'a pas de retour chariot. Cependant, si je renvoie 'valueForKey: @", tapez "' après avoir quitté 'didEndElement' il aura un retour chariot. Je ne comprends pas pourquoi. – conorgriffin

+0

J'ai découvert le problème. Le '\ r' était après l'élément fermé, par exemple' branche \ r'. Cela signifiait que je fermais l'élément, en appelant 'didEndElement' où je sortirais' currentText' et cela contiendrait 'branch'. Cependant, alors 'foundCharacters' serait appelé pour le' \ r' à la fin de la ligne.Cela ajouterait '' r' à 'currentText' dont la valeur a été pointée par' [currentBranchDictionary valueForKey: @ "tapez"] '. QED – conorgriffin