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

Я использую 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 в строке, но мое грубое введение в Objective-C продолжается ... Я только что понял, насколько я избалован. .NET BCL, где такие вещи, как Regex, так легко доступны.

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

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


person Ta01    schedule 09.02.2009    source источник


Ответы (3)


Проблема в том, что ваш 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];
person Louis Gerbarg    schedule 09.02.2009
comment
спасибо за ответ, я получаю сбой со следующим сообщением об исключении: [CXMLElement isEqualToString:]: нераспознанный селектор отправлен экземпляру - person Ta01; 09.02.2009
comment
Бьюсь об заклад, все это связано с тем фактом, что веб-служба, которую я пытаюсь использовать, основана на .NET, но, к сожалению, я не могу ее контролировать, я погуглил, и кажется, что атрибут xmlns является причиной всех проблемы. - person Ta01; 09.02.2009
comment
Я не использую TouchXML ни в каких проектах, хотя я использую libxml2 (для которого TouchXML является оболочкой), поэтому базовая библиотека работает. Меня не шокирует, если это не хорошо проверенный путь кода, возможно, вам нужно что-то исправить в TouchXML. - person Louis Gerbarg; 09.02.2009
comment
Спасибо. именно моя проблема, и это исправило ее. - person Greg; 18.08.2009
comment
Спасибо! Это решило мою проблему. - person dredful; 10.03.2011
comment
Спасибо. Я пытался использовать это, но я не был уверен, для чего нужен ключ NSDictionary, поэтому я просто ввел что-нибудь. Я продолжал использовать один и тот же XPath, хотя /foo/bar так что это не удалось. Затем я понял, что мне нужно использовать ключ внутри моего XPath, как вы продемонстрировали (сначала я этого не заметил), поэтому я использовал /ns:foo/ns:bar, где ns — это ключ, который я использовал, и он работал нормально . Надеюсь это поможет. - person aiham; 15.04.2011

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

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

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

person Community    schedule 15.07.2009

Пытаться

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
person Adam Rosenfield    schedule 09.02.2009
comment
Как сказано в ответе выше, вам нужен файл namespaceMapping. - person Sam Soffes; 22.07.2010