Получение значения атрибута из узла XML в Swift

Я пытаюсь быстро получить значение атрибута в узле XML. Ниже приведен пример кода. Я не вижу способа получить значение, поскольку никакие свойства или методы, похоже, не позволяют этого.

for word in dictionary.words {
    let xpath = "/strongsdictionary/entries/entry[greek[@unicode='" + word.word + "']]/pronunciation"
    do {
        let xmlnode = try document?.nodes(forXPath: xpath )
        // Need to get value of attribute named 'strongs' from the node here.
    } catch {
        debugPrint("Error finding xpath path.")
        break
    }
}

Это для macOS или iOS?

Mike Taverne 30.03.2018 22:17

Это для macOS.

doodle 30.03.2018 22:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 466
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

xmlnode - это массив XMLNode. Итерировать массив узлов. Если ваш xpath возвращает элементы, приведите каждый узел к XMLElement. Из элемента вы можете получить его атрибуты.

let xmlnodes = try document?.nodes(forXPath: xpath)
for node in xmlnodes {
    if let element = node as? XMLElement { 
        if let strongsAttr = element.attribute(forName: "strongs") {
            if let strongs = strongsAttr.stringValue {
                // do something with strongs
            }
        }
    }
}

Вы можете объединить три if let в один, но вышеуказанное легче отлаживать.

Огромное спасибо! Ваш туз. Это помогло. Для меня это было не так очевидно, читая схематическую документацию.

doodle 30.03.2018 23:17

Рад помочь. Пожалуйста, не забудьте принять ответ, который правильно отвечает на ваш вопрос. Щелкните галочку слева от ответа.

rmaddy 30.03.2018 23:25

Атрибут - это просто еще один узел. Измените выражение XPath, чтобы найти его:

let xpath = "/strongsdictionary/entries/entry[greek[@unicode='" + word.word + "']]/pronunciation/@strongs"

Метод .nodes возвращает список узлов. Убедитесь, что список не равен нулю и имеет один узел:

    // Get value of attribute named 'strongs'
    if let xmlnode = try document?.nodes(forXPath: xpath ), xmlnode.count == 1 {
        print(xmlnode[0].objectValue)
    }

Я мог найти это таким образом, но не мог понять, как извлечь из этого пользу. Спасибо за помощь.

doodle 31.03.2018 01:57

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