Question

J'utilise TouchXml en raison des limites de données NSXML sur l'iPhone réelle. 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 ...

<?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 d'obtenir 7800, i.e. FundValue. Quelqu'un peut-il me diriger dans la bonne direction, je me sers du TouchXml CXMLDocument et myParser est de type CXMLDocument, j'ai essayé

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

Noeuds Fondamentalement évalue à zéro

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

Mise à jour 1: Je l'ai abandonné l'analyse à l'aide XPath, et ont remplacé par NSURLRequest, alors maintenant je le XML entier dans une chaîne, mais mon grossière introduction à Objective-C Continues ... Je viens de réaliser que j'ai gâté devenir à la BCL .NET où les choses comme Regex sont si facilement disponibles.

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

La question est maintenant, comment puis-je obtenir le « 7800 » à l'intérieur FundValue qui est maintenant une grande chaîne. Je confirme que je l'ai dans mon NSString en écrivant à l'aide NSLog.

Était-ce utile?

La solution

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 mappage par défaut, et XPath ne définit pas une bonne façon de gérer cela en interne, de sorte que vous ne pouvez pas fixer simplement en changeant le XPath. Au lieu de cela, vous devez informer l'interprète comment vous voulez la carte dans votre XPath.

On dirait que 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];

Autres conseils

J'ai eu un problème similaire. Toute sélection sur un fichier XML qui a un espace de noms spécifié (xmlns = « http: // somenamespace ») entraînera pas de nœuds trouvés. Très étrange étant donné qu'il ne supporte pas les formats d'espace de noms supplémentaires tels que xmlns: somenamespace = « http: // somenamespace ».

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

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

Essayez

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top