10
votes

Exemple NSXMLParser

J'ai un xml comme celui-ci xxx

maintenant, je veux analyser uniquement des valeurs spécifiques à partir de ceci. Par exemple, comment puis-je obtenir la valeur du nœud ayant une signature correspondante AS -804

s'il vous plaît aidez-moi ..

Je connais les bases de NSXMLParser, mais ne savez pas comment Achevez l'analyse conditionnelle.

Merci.


3 commentaires

Vous n'allez jamais être intéressé par un élément spécifique plutôt que le contenu du document dans son ensemble?


Oui, j'ai besoin d'analyser la valeur de nœud spécifique (type de conditionnel comme je l'ai dit plus tôt)


Dans ce cas, NSXMLParser n'est probablement pas le meilleur match pour vos besoins - voir ma réponse pour toutes les informations.


3 Réponses :


4
votes

Il existe efficacement deux approches pour analyser XML - un événement entraîné une (telle que celle utilisée par NSXMLParser) et une approche d'arbres (telle que celle utilisée par NSXML).

Si vous n'êtes qu'après des éléments spécifiques, il serait probablement beaucoup plus facile d'utiliser l'approche d'arborescence utilisée par NSXML, car il vous permettra de demander des documents XML à l'aide de XPath (et de XQuery) pour renvoyer des nœuds spécifiques, etc. que vous êtes intéressé.

Si cela semble être une approche plus fructueuse qui utilise NSXMLParser pour itérer sur toute la structure, je vous recommanderais de lire le Introduction au guide de programmation XML basé sur des arbres pour Cacao . (La section "Interrogation d'une section XML" devrait avoir un intérêt particulier.)


8 commentaires

Donc, si j'utilise nsxmlm, je peux réaliser une analyse conditionnelle que je veux. Avez-vous un exemple similaire que je peux utiliser comme référence?


@HMTHUR Si vous regardez la section "Interrogation d'une section XML" du document i Lien vers ci-dessus, il existe des échantillons de code inclus.


Juste pour confirmer, donc NSXML est disponible sur iOS? Voir Stackoverflow.com/Questtions/3447993/...


@hmthur arrhh. Mes excuses - ce n'est pas disponible sur iOS. Dans ce cas, vous voulez probablement utiliser libxml (il a XPath). Voir Cocoawithlove.com/2008/10/... - a>


libxml a la tête trop compliquée à utiliser..Je signifie qu'il s'agit d'une API basée sur C, très diff du code Obj-C, je suis habitué à ... Avez-vous un exemple de référence à l'aide de libxml qui fait une chose similaire que je suis à la recherche..


@HMTHUR La section "La mise en œuvre" du blog que j'ai lié à est presque parfaite comme exemple (et vous pouvez télécharger le code). Cela dit, il est peut-être légèrement plus complexe que d'utiliser une implémentation pure cacao si vous n'êtes pas habitué à utiliser des API basées sur C.


Y a-t-il un moyen de contourner cela ... comme en utilisant libxml sous la hotte, mais nous devons utiliser des appels de type Obj-C de l'extérieur ...


@hmthur Nope - c'est ce qui est. Cela dit, il existe d'autres bibliothèques XML disponibles, mais je ne suis pas consciente de la main s'ils soutiennent XPath. Cela dit, cet article de blog pourrait s'avérer très utile: raywenderlich.com/553/...



10
votes
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    currentKey = nil;
    [currentStringValue release];
    currentStringValue = nil;
    if([elementName isEqualToString:@"Value"]){
        //alloc some object to parse value into
    } else if([elementName isEqualToString:@"Signature"]){
        currentKey = @"Signature";
        return;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if(currentKey){
        if(!currentStringValue){
            currentStringValue = [[NSMutableString alloc] initWithCapacity:200];
        }
        [currentStringValue appendString:string];
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if([elementName isEqualToString:@"Signature"] && [currentStringValue intValue] == 804){
        ivar.signature = [currentStringValue intValue];
        return;
    }
}
Something like this.
Note I havent really tested this code on compiler so there will be syntax errors here & there. 

1 commentaires

Cela semble être plus facile pour moi de mettre en œuvre. Cependant, j'ai une question ... en fait, je cherche la chaîne stockée dans correspondant à l'élément , c'est-à-dire que je dois obtenir le texte pour avoir -804 non sûr si votre exemple sera fais ça.



6
votes

Vous voudrez peut-être examiner à l'aide de touchxml - https://github.com/mrevilme/touchxml qui offre une belle xml Caractéristiques de manutention, y compris l'utilisation de XPath, ce que vous essayez de faire beaucoup plus simple.

Un exemple hypothétique basé sur votre modèle: xxx

Note: < / STRUT> Aucun de ces expaumes ne sont testés.

J'ai trouvé TouchXML très utile et compact.

espère que cela aide.


0 commentaires