2009-02-09 5 views
12

J'utilise TouchXml en raison des limitations données de NSXML sur l'iPhone réel. Quoi qu'il en soit, je viens juste de commencer avec Objective-C, je viens d'un milieu C#, et se sentait comme apprendre quelque chose new..anyhow .. voici mon fichier xml ...Obtenir la valeur d'un élément dans Cocoa en utilisant TouchXML

<?xml version="1.0" encoding="utf-8"?> 
<FundInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/webservices"> 
    <FundsReleaseDate>2009-02-11T00:00:00</FundsReleaseDate> 
    <FundValue>7800</FundValue> 
    <FundShares>1000</FundShares> 
</FundInfo> 

Je suis en train pour obtenir 7800, c'est-à-dire FundValue. me diriger quelqu'un peut dans le bon sens, je me sers du TouchXml CXMLDocument et myParser est de type CXMLDocument, j'ai essayé

NSArray *nodes = [myParser nodesForXPath:@"//FundInfo" error:&err]; 

nœuds Fondamentalement évalue à zéro

if ([nodes count] > 0) { 
    amount = [nodes objectAtIndex:1]; 
} 

MISE À JOUR 1: Je l'ai abandonné en utilisant XPath, et l'ai remplacé par NSURLRequest, alors maintenant j'ai le XML entier dans une chaîne, mais mon introduction grossière à l'objectif-C continue ... Je viens de réaliser à quel point je suis devenu corrompu .NET BCL où des choses comme Regex sont si facilement disponibles.

UPDATE2: J'ai compris comment utiliser RegexKitLite pour regex.

Donc la question est maintenant, comment puis-je obtenir le "7800" à partir de FundValue qui est maintenant une grande chaîne. J'ai confirmé que je l'ai dans mon NSString en l'écrivant en utilisant NSLog.

Répondre

25

Le problème est que votre XML possède un espace de noms, ce qui signifie que votre XPath ne correspond pas réellement. Malheureusement, il n'y a pas de mapping par défaut, et XPath ne définit pas réellement un bon moyen de gérer cela en interne, donc vous ne pouvez pas le réparer simplement en changeant le XPath. Au lieu de cela, vous devez informer l'interpréteur de la façon dont vous voulez le mapper dans votre XPath.

Il ressemble TouchXML met en œuvre un soutien pour cette via:

- (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error; 

vous pouvez essayer quelque chose comme:

NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://tempuri.org/webservices" forKey:@"tempuri"]; 
[myParser nodesForXPath:@"//tempuri:FundInfo" namespaceMappings:mappings error:&err]; 
+0

merci pour la réponse, je reçois un accident avec le message d'exception suivant:.. [CXMLElement isEqualToString :]: sélecteur non reconnu envoyé à l'instance – kd7

+0

Je parie que tout cela est lié au fait que le service Web que j'essaie t o consommer est basé sur .NET, mais malheureusement je n'ai aucun contrôle sur, j'ai parcouru les pages et il semble que l'attribut xmlns est la cause de tous les problèmes. – kd7

+0

Je n'utilise pas TouchXML dans les projets, bien que j'utilise libxml2 (qui est ce à quoi TouchXML est destiné), donc la bibliothèque sous-jacente fonctionne. Cela ne me choquerait pas si ce n'est pas un chemin de code bien testé, vous devrez peut-être corriger quelque chose dans TouchXML. –

-1

Essayez

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err]; 
+0

Comme la réponse dit ci-dessus, vous avez besoin du 'namespaceMapping' –

0

J'ai eu un problème similaire. TOUTE sélection sur un XML dont l'espace de nommage est spécifié (xmlns = "http: // somenamespace") n'aura aucun noeud trouvé. Très étrange étant donné qu'il supporte les formats d'espace de noms supplémentaires tels que xmlns: somenamespace = "http: // somenamespace".

Dans tous les cas, par loin la meilleure chose à faire est de faire une chaîne remplacer et remplacer xmlns = "http://tempuri.org/webservices avec une chaîne vide.

J'aime l'ensemble touchxml, mais je ne peux pas croire ce bug existe encore

Questions connexes