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

StackOverflow https://stackoverflow.com/questions/526887

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Попробуй

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top