Вопрос

Я пытаюсь использовать XPath для синтаксического анализа XML-документа.Гипотетически говоря, один из моих NSXMLElement выглядит следующим образом:

<foo bar="yummy">

Я пытаюсь получить значение для атрибута bar, однако любая интерпретация кода, который я использую, возвращает мне bar ="woo", что означает, что мне нужно выполнить дальнейшую обработку строк, чтобы получить доступ к woo и только к woo .

По сути, я делаю что-то вроде

NSArray *nodes = [xmlDoc nodesForXPath:@"foo/@bar" error:&error];
xmlElement = [nodes objectAtIndex:0];

Можно ли в любом случае написать приведенный выше код, чтобы просто дать мне yummy, а не bar = "yummy", чтобы я мог освободиться от разбора строки?

Спасибо.


Предполагая, что используется TouchXML, есть ли еще способ получить аналогичные результаты?Как при захвате только значения для атрибута, без атрибута ="value"?Это приводит к тому, что затем дополнительно приходится анализировать строку, чтобы получить значение.

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

Решение

Предполагается, что TouchXML API является точной копией реализации NSXML от Apple, поэтому он должен быть таким же, за исключением того, что вы замените все NS-методы C-методами.

Классы TouxhXML сопоставляются непосредственно с классами NSXML. NSXMLNode -> CXMLNode ( NSXMLNode), NSXMLDocument -> CXMLDocument, Элемент NSXMLElement -> Элемент CXMLElement.По очевидным причинам вы не можете смешивать и сопоставлять классы NSXML и TouchXML.

Методы TouxhXML также напрямую сопоставляются с методами NSXML, но поддерживается только небольшое подмножество методов.Имена констант и перечислений почти эквивалентны (CXML...vs NSXML ...), но постоянные значения не будут эквивалентны

ссылка

Используя либо обычные классы Apple, либо платформу TouchXML, следующий код предоставит вам только строку "yummy" для вашего примера.

 NSArray *nodes = [xmlDoc nodesForXPath:@"./foo/@bar" error:&err];
 NSString *value = [[nodes objectAtIndex:0] stringValue];

Удачи,

Брайан Джи

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

Если вы пытаетесь использовать класс NSXMLDocument на iPhone, вы будете сильно разочарованы, потому что этот класс (и связанные с ним классы NSXMLNode, NSXMLElement и т.д.) Недоступен на телефоне (они доступны в симуляторе, что может сбить с толку).

Взгляните на libxml2, чтобы выполнить синтаксический анализ XML на телефоне.Есть несколько бесплатных фреймворков (я считаю, что TouchXML - хороший) для этого.

При этом, если вы хотите запустить этот код на Mac, вы можете использовать метод NSXMLElement -attributeForName: чтобы извлечь только тот атрибут, который вы хотите.

Бен прав - хотя код iPhone-SDK будет собран с помощью NSXMLDocument и запущен в симуляторе, он вообще не будет работать на устройстве.В документах, вероятно, это где-то упоминается, но это довольно неясно.TouchXML является частью TouchCode;вы можете найти более подробную информацию об этом здесь.

У iPhone действительно есть доступ к NSXMLParser, который представляет собой симпатичный маленький синтаксический анализатор sax.У Аарона Хиллегасса есть хорошая статья об использовании NSXMLParser.Он не поддерживает XPath, но довольно удобен для копирования xml в ваши объекты данных.

Синтаксический анализ XML в Cocoa

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top