2009-02-09 12 views
12

Używam TouchXML ze względu na podane ograniczenia NSXML na rzeczywistych iPhone. W każdym razie, ja tylko wychodząc z Objective-C, I pochodzić z tła C#, i czułem się jak się czegoś new..anyhow .. Oto mój plik xml ...Uzyskiwanie wartości elementu w kakao za pomocą 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> 

Próbuję uzyskać 7800, tj. FundValue. Czy ktoś może wskazać mi w prawidłowym kierunku, używam TouchXml CXMLDocument i myParser jest typu CXMLDocument próbowałem

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

Zasadniczo węzłów ma wartość zerową

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

Aktualizacja 1: Mam opuszczony parsowania przy użyciu XPath, i zastąpiłem go NSURLRequest, więc teraz mam cały XML w ciąg, ale moje niegrzeczne wprowadzenie do obiektywu-C kontynuuje ... Właśnie zdałem sobie sprawę, jak zepsute stałem się. BCL BC, gdzie rzeczy takie jak Regex są tak łatwo dostępne.

UPDATE2: Zrozumiałem, jak używać RegexKitLite dla regex.

Tak więc pytanie brzmi: jak uzyskać "7800" z wewnątrz FundValue, który jest teraz jednym dużym ciągiem. Potwierdziłem, że mam to w moim NSString, pisząc to używając NSLog.

Odpowiedz

25

Problemem jest to, że XML ma nazw, co oznacza, że ​​XPath faktycznie nie odpowiadają. Niestety nie ma domyślnego mapowania, a XPath w rzeczywistości nie definiuje dobrego sposobu, aby poradzić sobie z tym wewnętrznie, więc nie można go naprawić po prostu przez zmianę XPath. Zamiast tego musisz poinformować tłumacza, jak chcesz go zmapować w XPath.

Wygląda TouchXML realizuje obsługę tego poprzez:

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

Więc można spróbować czegoś takiego:

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

dzięki za odpowiedź, jestem coraz awarię z następującym komunikatem wyjątek:.. [CXMLElement isEqualToString :]: nierozpoznany selektor wysłany do instancji – kd7

+0

Założę się, że to wszystko jest związane z faktem, że usługa sieciowa próbuję t o spożywa się na bazie .NET, ale niestety nie mam nad nim kontroli, przeszukałem go i wydaje mi się, że atrybut xmlns jest przyczyną wszystkich problemów. – kd7

+0

Nie używam TouchXML w żadnym projekcie, ale używam libxml2 (do czego służy TouchXML), więc biblioteka bazowa działa. Nie zaszokowałoby mnie to, że nie jest to dobrze przetestowana ścieżka kodu, być może trzeba będzie naprawić coś w TouchXML. –

-1

Spróbuj

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

Jak wyżej odpowiedź mówi, potrzebne są 'namespaceMapping' –

0

miałem podobny problem. Dowolny wybór w XML, który ma określony obszar nazw (xmlns = "http: // somenamespace") nie spowoduje znalezienia żadnych węzłów. Bardzo dziwne, biorąc pod uwagę, że obsługuje dodatkowe formaty przestrzeni nazw, takie jak xmlns: somenamespace = "http: // somenamespace".

W każdym razie przez daleko najłatwiej zrobić to zrobić łańcuch wymienić i zastąpić xmlns = "http://tempuri.org/webservices z pustym ciągiem.

Ogólnie lubię touchxml, ale ja nie mogę uwierzyć, że ten błąd nadal istnieje

Powiązane problemy