2009-02-09 7 views
12

Ich benutze TouchXml wegen der gegebenen Beschränkungen von NSXML auf dem tatsächlichen iPhone. Wie auch immer, ich bin gerade erst aus mit Objective-C, die ich von einem C# -Hintergrund kommen, und hatte das Gefühl, etwas zu lernen new..anyhow .. hier meine XML-Datei ist ...Den Wert eines Elements in Cocoa mit TouchXML erhalten

<?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> 

Ich versuche, um 7800 zu bekommen, dh FundValue. Kann mir jemand in die richtige Richtung weisen, ich die TouchXML CXMLDocument verwende und myParser ist vom Typ CXMLDocument habe ich

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

Grundsätzlich Knoten wertet auf Null

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

UPDATE 1: Ich aufgegeben haben Parsing mit XPath, und habe es mit NSURLRequest ersetzt, so jetzt habe ich die gesamte XML in einer Zeichenfolge, aber meine unhöfliche Einführung in objective-C geht weiter ... Ich habe gerade festgestellt, wie verwöhnt ich geworden bin Regex sind so leicht verfügbar.

UPDATE2: Ich habe herausgefunden, wie RegexKitLite für Regex zu verwenden.

Die Frage ist nun, wie bekomme ich die "7800" von innerhalb FundValue, die jetzt eine große Zeichenfolge ist. Ich habe bestätigt, dass ich es in meinem NSString habe, indem ich es mit NSLog schreibe.

Antwort

25

Das Problem ist, dass Ihr XML einen Namensraum hat, die Ihre XPath bedeutet nicht wirklich entsprechen. Leider gibt es keine Standardzuordnung, und XPath definiert nicht wirklich eine gute Möglichkeit, dies intern zu behandeln, also können Sie es nicht einfach durch Ändern des XPath beheben. Stattdessen müssen Sie dem Interpreter mitteilen, wie Sie ihn in Ihrem XPath abbilden möchten.

Es sieht aus wie TouchXML Unterstützung für diese implementiert über:

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

So können Sie versuchen, so etwas wie:

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

danke für die Antwort, ich bin immer einen Absturz mit der folgenden Ausnahmemeldung:.. [CXMLElement isEqualToString :]: unerkannter Selektor an Instanz gesendet – kd7

+0

Ich wette, das ist alles mit der Tatsache verbunden, dass der Web-Service ich versuche t o consum ist .NET-basiert, aber leider habe ich keine Kontrolle darüber, ich habe gegoogelt und es scheint, dass das xmlns-Attribut die Ursache aller Probleme ist. – kd7

+0

Ich benutze TouchXML nicht in irgendwelchen Projekten, obwohl ich libxml2 benutze (wozu TouchXML ein Wrapper ist), also funktioniert die zugrunde liegende Bibliothek. Es würde mich nicht schockieren, wenn dies kein gut getesteter Codepfad ist, müssen Sie möglicherweise etwas in TouchXML reparieren. –

-1

Versuchen

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

Wie die Antwort oben sagt, müssen Sie die 'namespaceMapping' –

0

Ich hatte ein ähnliches Problem. Bei einer Auswahl in einer XML-Datei, für die ein Namespace angegeben ist (xmlns = "http: // somenamespace"), werden keine Knoten gefunden. Sehr seltsam, wenn man bedenkt, dass es die zusätzlichen Namespace-Formate wie xmlns: somenamespace = "http: // somenamespace" unterstützt.

In jedem Fall durch weit die einfachste Sache zu tun "eine Zeichenfolge ersetzen und ersetzen xmlns = http://tempuri.org/webservices mit einem leeren String wird tun.

Insgesamt I TouchXML mag, aber ich kann nicht glauben, dass dieser Fehler noch vorhanden ist