Pergunta

Eu estou usando TouchXml por causa das limitações dadas de NSXML no iPhone real. Enfim, eu estou apenas começando com Objective-C, eu venho de uma # fundo C, e senti como aprender algo new..anyhow .. aqui é o meu arquivo 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>

Eu estou tentando obter 7800, ou seja FundValue. Pode alguém me aponte na direção correta, eu estou usando o TouchXml CXMLDocument e myParser é do tipo CXMLDocument, eu tentei

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

Basicamente nós avalia a zero

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

UPDATE 1: Eu tenho abandonado a análise utilizando XPath e substituíram-lo com NSURLRequest, então agora eu tenho todo o XML em uma corda, mas meu rudes introdução ao objective-C continua ... Eu só percebi o quão estragado Eu tenho tornar-se para o .NET BCL onde as coisas como Regex são tão facilmente disponíveis.

UPDATE2: Eu descobri como usar RegexKitLite para regex.

Portanto, a questão agora é: como faço para obter o "7800" de dentro FundValue que agora é uma grande string. Eu confirmei que eu tenho isso no meu NSString por escrevê-lo usando NSLog.

Foi útil?

Solução

O problema é que o XML tem um espaço de nomes, o que significa que o seu XPath não faz correspondência. Infelizmente não há nenhum mapeamento padrão, e XPath na verdade não define uma boa maneira de lidar com isso internamente, para que você não pode corrigi-lo simplesmente alterando o XPath. Em vez disso você precisa informar o intérprete como você deseja mapeá-lo em sua XPath.

Parece que o apoio implementos TouchXML para esta via:

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

Assim, você pode tentar algo como:

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

Outras dicas

Eu tive um problema semelhante. Qualquer seleção em um XML que tem um namespace especificado (xmlns = "http: // SomeNameSpace") resultará em nenhum nó encontrados. Muito estranho, considerando que suporta os formatos de namespace adicionais, tais como xmlns: SomeNameSpace = "http: // SomeNameSpace".

Em qualquer caso, pela muito a melhor coisa a fazer é fazer um texto de substituição e substituir xmlns = "http://tempuri.org/webservices com uma string vazia.

No geral I como touchxml, mas eu não posso acreditar que esse bug ainda existe.

Tente

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top