Подтвердить что ты не робот

Получение значения элемента в Cocoa с помощью TouchXML

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

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

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

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

UPDATE2: Я выяснил, как использовать RegexKitLite для регулярного выражения.

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

4b9b3361

Ответ 1

Проблема в том, что ваш 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];

Ответ 2

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

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

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

Ответ 3

Try

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