Получение значения элемента в какао с использованием TouchXML - PullRequest
12 голосов
/ 09 февраля 2009

Я использую TouchXml из-за заданных ограничений NSXML на реальном iPhone. Во всяком случае, я только начинаю с Objective-C, я из C # фона и чувствую, что изучаю что-то новое ... как-то ... вот мой 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>

Я пытаюсь получить 7800, т. Е. FundValue. Может кто-нибудь указать мне правильное направление, я использую TouchXml CXMLDocument и myParser имеет тип CXMLDocument, я попытался

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

В основном узлы оцениваются в ноль

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

ОБНОВЛЕНИЕ 1: я отказался от синтаксического анализа с использованием XPath и заменил его NSURLRequest, так что теперь у меня есть весь XML в строке, но мое грубое введение в target-C продолжается ... Я только что понял, насколько испорчен стать на .NET BCL, где такие вещи, как Regex так легко доступны.

ОБНОВЛЕНИЕ2: я выяснил, как использовать RegexKitLite для регулярных выражений.

Итак, вопрос в том, как мне получить "7800" из FundValue, который теперь является одной большой строкой. Я подтвердил, что у меня есть это в моей NSString, написав это, используя NSLog.

Ответы [ 3 ]

25 голосов
/ 09 февраля 2009

Проблема в том, что у вашего XML есть пространство имен, что означает, что ваш XPath на самом деле не совпадает. К сожалению, нет отображения по умолчанию, и XPath на самом деле не определяет хороший способ справиться с этим внутренне, поэтому вы не можете исправить это, просто изменив XPath. Вместо этого вам нужно сообщить переводчику, как вы хотите отобразить его в XPath.

Похоже, что TouchXML реализует поддержку через:

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

Так что вы можете попробовать что-то вроде:

NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://tempuri.org/webservices" forKey:@"tempuri"];
[myParser nodesForXPath:@"//tempuri:FundInfo" namespaceMappings:mappings error:&err];
0 голосов
/ 16 июля 2009

У меня была похожая проблема. ЛЮБОЙ выбор XML, для которого задано пространство имен (xmlns = "http://somenamespace"), приведет к тому, что узлы не найдены. Очень странно, учитывая, что он поддерживает дополнительные форматы пространства имен, такие как xmlns: somenamespace =" http://somenamespace".

В любом случае, far проще всего сделать, заменить строку и заменить xmlns = "http://tempuri.org/webservices пустой строкой.

В целом мне нравится touchxml, но я не могу поверить, что эта ошибка все еще существует.

0 голосов
/ 09 февраля 2009

Попробуйте

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