Pregunta

Estoy utilizando 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 ...

<?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 conseguir 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];

Nodos Básicamente se evalúa como nil

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

ACTUALIZACIÓN 1: He abandonado el análisis utilizando XPath, y lo han sustituido por NSURLRequest, así que ahora tengo todo el XML en una cadena, pero mi introducción grosero con Objective-C continúa ... Me acabo de dar cuenta de cómo en mal estado que tengo convertido a la BCL .NET donde cosas como expresiones regulares son tan fácilmente disponibles.

Update2: He descubierto cómo utilizar RegexKitLite de expresiones regulares.

Así que la pregunta ahora es, ¿cómo puedo obtener el "7800" desde dentro FundValue que ahora es una cadena grande. He confirmado lo tengo en mi NSString escribiéndolo usando NSLog.

¿Fue útil?

Solución

El problema es que el XML tiene un espacio de nombres, lo que significa que su XPath no coincide realidad. Desafortunadamente no hay una asignación predeterminada, y XPath no define una buena manera de manejar esto internamente, por lo que no se puede arreglar simplemente cambiando el XPath. En su lugar, es necesario informar al intérprete la forma en que desea asignar 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];

Otros consejos

He tenido un problema similar. CUALQUIER selección en un archivo XML que tiene un espacio de nombres especificado (xmlns = "http: // somenamespace") dará lugar a ningún nodo encontrados. Muy extraño teniendo en cuenta que es compatible con los formatos de espacios de nombres adicionales, tales 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.

Trate

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top