Domanda

Sto usando TouchXML a causa delle limitazioni di date NSXML sul vero e proprio iPhone. Comunque, sto solo agli inizi con Objective-C, vengo da un background C #, e si sentiva come imparare qualcosa new..anyhow .. ecco il mio file 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>

Sto cercando di ottenere 7800, vale a dire FundValue. Qualcuno mi può punto nella giusta direzione, Sto usando il TouchXML CXMLDocument e myParser è di tipo CXMLDocument, ho cercato

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

In sostanza nodi restituisce nil

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

UPDATE 1: ho abbandonato l'analisi utilizzando XPath, e hanno sostituito con NSURLRequest, così ora ho l'intero XML in una stringa, ma la mia introduzione al maleducato Objective-C continua ... ho appena capito quanto viziati ho diventato per il BCL .NET in cui sono così facilmente disponibili cose come Regex.

UPDATE2: Ho capito come utilizzare RegexKitLite per regex.

Quindi la domanda ora è: come faccio ad avere il "7800" da dentro FundValue che ora è una grande stringa. Ho confermato l'ho nel mio NSString scrivendo usando NSLog.

È stato utile?

Soluzione

Il problema è che il vostro XML ha uno spazio dei nomi, il che significa che il vostro XPath in realtà non corrisponde. Purtroppo non v'è alcuna mappatura predefinita, e XPath in realtà non definisce un buon modo per gestire questa situazione internamente, quindi non si può risolvere il problema semplicemente cambiando la XPath. Invece è necessario informare l'interprete come si desidera mappare nel vostro XPath.

Sembra che TouchXML implementa il supporto per questa via:

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

Così si può provare qualcosa di simile:

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

Altri suggerimenti

Ho avuto un problema simile. Qualsiasi selezione su un XML che ha uno spazio dei nomi specificato (xmlns = "http: // somenamespace") si tradurrà in nessun nodo trovati. Molto strano considerando che supporta i formati di spazio dei nomi aggiuntivi quali xmlns: somenamespace = "http: // somenamespace".

In ogni caso, da molto la cosa più facile da fare è fare una stringa sostituire e sostituire xmlns = "http://tempuri.org/webservices con una stringa vuota.

Nel complesso mi piace TouchXML, ma non riesco a credere che questo bug esiste ancora.

Prova

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top