cocoa touch - framework - Obteniendo el valor de un Elemento en Cocoa usando TouchXML
cocoa framework (3)
El problema es que su XML tiene un espacio de nombres, lo que significa que su XPath en realidad no coincide. Lamentablemente, no existe una asignación predeterminada, y XPath en realidad no define una buena manera de manejar esto internamente, por lo que no puede solucionarlo simplemente cambiando el XPath. En su lugar, debe informar al intérprete cómo desea asignarlo en su XPath.
Parece que TouchXML implementa soporte para esto a través de:
- (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error;
Entonces puedes probar algo como:
NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://tempuri.org/webservices" forKey:@"tempuri"];
[myParser nodesForXPath:@"//tempuri:FundInfo" namespaceMappings:mappings error:&err];
Estoy usando TouchXml debido a las limitaciones dadas de NSXML en el iPhone real. De todos modos, recién estoy empezando con Objective-C, vengo de un fondo de C # y tengo ganas de aprender algo nuevo ... de todos modos ... aquí está mi archivo 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>
Estoy tratando de obtener 7800, es decir, FundValue. ¿Puede alguien señalarme en la dirección correcta, estoy usando el TouchXml CXMLDocument y myParser es del tipo CXMLDocument, lo he intentado
NSArray *nodes = [myParser nodesForXPath:@"//FundInfo" error:&err];
Básicamente, los nodos se evalúan como nulos
if ([nodes count] > 0 ) {
amount = [nodes objectAtIndex:1];
}
ACTUALIZACIÓN 1: he abandonado el análisis utilizando XPath, y lo he reemplazado con NSURLRequest, así que ahora tengo todo el XML en una cadena, pero mi grosera introducción al objetivo-C continúa ... Me di cuenta de lo malcriado que me he convertido en el .NET BCL donde cosas como Regex están tan fácilmente disponibles.
ACTUALIZACIÓN2: He descubierto cómo usar RegexKitLite para expresiones regulares.
Entonces la pregunta ahora es, ¿cómo obtengo el "7800" desde dentro de FundValue, que ahora es una gran cadena? He confirmado que lo tengo en mi NSString escribiéndolo usando NSLog.
Tratar
NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Tuve un problema similar. CUALQUIER selección en un XML que tenga un espacio de nombre especificado (xmlns = "http: // somenamespace") dará como resultado que no se encuentren nodos. Muy extraño considerando que admite formatos de espacio de nombres adicionales como xmlns: somenamespace = "http: // somenamespace".
En cualquier caso, de lejos , lo más fácil es hacer una cadena reemplazar y reemplazar xmlns = "http://tempuri.org/webservices con una cadena vacía.
En general, me gusta touchxml, pero no puedo creer que este error todavía exista.