Frage

Ich verwende TouchXML wegen der gegebenen Grenzen 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 ...

<?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, 7800 zu erhalten, das heißt FundValue. Kann mich jemand in der richtigen Richtung weisen, ich die TouchXML CXMLDocument verwenden und myParser ist vom Typ CXMLDocument, ich habe versucht,

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

Grundsätzlich Knoten auswertet auf Null

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

UPDATE 1: Ich habe Parsing aufgegeben XPath verwenden, und habe es mit NSURLRequest ersetzt, so dass ich jetzt das gesamte XML in einem String, aber meine unhöflich Einführung in Objective-C weiter ... Ich habe gerade gemerkt, wie verdorben ich habe werden auf die .NET BCL, wo Dinge wie Regex sind so leicht zugänglich sind.

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

So, jetzt ist die Frage, wie kann ich die „7800“ erhalten von innen FundValue das ist jetzt eine große Zeichenfolge. Ich habe bestätigt, ich es in meinem NSString haben, indem sie es mit NSLog zu schreiben.

War es hilfreich?

Lösung

Das Problem ist, dass Ihr XML einen Namensraum hat, die Ihre XPath bedeutet nicht wirklich entsprechen. Leider gibt es keine Standardzuordnung und XPath nicht wirklich eine gute Art und Weise definiert diese intern zu handhaben, so dass Sie es nicht einfach beheben, indem Sie den XPath ändern. Stattdessen müssen Sie den Interpreter informieren, wie Sie es in Ihrem XPath zuordnen möchten.

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

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

Sie können also so etwas wie versuchen:

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

Andere Tipps

Ich hatte ein ähnliches Problem. ANY Auswahl auf einem XML, die einen Namespace angegeben (xmlns = „http: // somenamespace“) hat, wird gefunden in keinem Knoten führen. Sehr seltsam es unterstützt die zusätzlichen Namespace-Formate wie xmlns Berücksichtigung somenamespace = „http: // somenamespace“.

In jedem Fall von far die einfachste Sache zu tun, ist eine Zeichenfolge ersetzen und xmlns ersetzen = "http://tempuri.org/webservices mit einem leeren String.

Insgesamt mag ich TouchXML, aber ich kann dieser Fehler immer noch nicht glauben, vorhanden ist.

Versuchen

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top