NSXML добавляет пространство имен, чтобы заставить XPath-запросы работать - PullRequest
2 голосов
/ 27 июня 2011

У меня проблема с тем, что мои запросы XPath не работают, если в документе определен атрибут XMLNS.Я понял, что это, вероятно, потому, что все элементы используют XMLNS по умолчанию, а мой XPath - нет.Однако я не могу найти подходящих методов в NSXML (общее семейство классов Objective C для описания и анализа XML-документов) для решения проблемы.

Например, следующий код работает нормально, если data делаетне содержат XMLNS.Как заставить код работать, если он работает?

NSXMLDocument *xml = [[NSXMLDocument alloc] initWithData:data options:0 error:&error];   
NSArray *result = [xml nodesForXPath:@"/parent/child" error:&error];

1 Ответ

1 голос
/ 14 февраля 2013

Я только что потратил некоторое время на решение аналогичной проблемы (файлы Google KML). Возможно, ваша проблема связана с проблемой пространства имен. Когда вы устанавливаете сопоставления пространства имен, дайте пространству имен ключ, а затем префикс ваших селекторов в выражениях XPath с этим ключом, за которым следует двоеточие (:). В этом решении используются CXMLDocuments и CXMLElements из аккуратной библиотеки TouchXML .

Чтобы начать с простого примера, скажем, ваш XML был:

<books xmlns="http://what.com/ever">
  <book>
    <title>Life of Pi</title>
  </book>
  <book>
    <title>Crime and Punishment</book>
  </book
</books>

Вы бы выбрали все книги с:

// So, assuming you've already got the data for the XML document
CXMLDocument* xmldoc = [[CXMLDocument alloc] initWithData:xmlDocData options:0 error:nil];
NSDictionary *namespaceMappings = [NSDictionary dictionaryWithObjectsAndKeys:@"http://what.com/ever", @"nskey", nil];
NSError *error = nil;
NSArray *bookElements = [xmldoc nodesForXPath:@"/nskey:books/nskey:book" namespaceMappings:mappings error:&error];

Обратите внимание, что вам нужно ставить префикс перед каждым элементом, а не только над тем, где объявлено пространство имен.

...