2009-02-09 10 views
12

Estoy usando TouchXml debido a las limitaciones dadas de NSXML en el iPhone real. De todos modos, estoy empezando a cabo con Objective-C, vengo de un fondo # C, y se sentía como aprender algo new..anyhow .. aquí está mi archivo xml ...Obteniendo el valor de un Elemento en Cocoa usando TouchXML

<?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 intentando para obtener 7800, es decir, FundValue. Alguien me puede apuntar en la dirección correcta, estoy usando el TouchXml CXMLDocument y myParser es de tipo CXMLDocument, he tratado

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

Básicamente nodos evalúa a cero

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

ACTUALIZACIÓN 1: He abandonado analizando usando XPath, y lo he reemplazado con NSURLRequest, así que ahora tengo todo el XML en una cadena, pero mi grosera introducción a Object-C continúa ... Me acabo de dar cuenta de lo malcriado que me he vuelto al .NET BCL donde cosas como Regex son tan fácilmente disponibles.

UPDATE2: He descubierto cómo usar RegexKitLite para regex.

Entonces, la pregunta ahora es, ¿cómo obtengo el "7800" dentro de FundValue, que ahora es una gran cadena? He confirmado que lo tengo en mi NSString escribiéndolo usando NSLog.

Respuesta

25

El problema es que el XML tiene un espacio de nombres, lo que significa que su XPath no coincide realidad. 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 esta vía:

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

Así que usted puede intentar algo como:

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

gracias por la respuesta, estoy recibiendo un choque con el siguiente mensaje de excepción:.. [CXMLElement isEqualToString :]: selector no reconocido enviado a la instancia – kd7

+0

Apuesto a que todo esto está relacionado con el hecho de que el servicio web que estoy intentando t o Consumir está basado en .NET, pero desafortunadamente no tengo control sobre él, he buscado en Google y parece que el atributo xmlns es la causa de todos los problemas. – kd7

+0

No uso TouchXML en ningún proyecto, aunque utilizo libxml2 (que es para lo que TouchXML es un contenedor), por lo que la biblioteca subyacente funciona. No me sorprendería si esta no es una ruta de código bien probada, es posible que deba arreglar algo en TouchXML. –

-1

Trate

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

Como dice la respuesta anterior, se necesita el 'namespaceMapping' –

0

que tenía 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, por ahora la cosa más fácil que hacer es hacer una cadena de reemplazar y sustituir xmlns = "http://tempuri.org/webservices con una cadena vacía.

En general me gusta touchxml, pero no puedo creer que todavía existe este error

Cuestiones relacionadas