XMLSimple анализирует значение ключа в хэш - PullRequest
0 голосов
/ 19 августа 2011

у меня есть следующий xml:

        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <integer>1</integer>
        <key>Some Text</key>
        <true/>
        <key>Some Text</key>
        <true/>
        <key>Some Text</key>
        <integer>6</integer>
        <key>Some Text</key>
        <true/>

Как мне настроить гем Ruby XMLSimple для получения хэша с ключом / значением? Или XMLSimple не тот инструмент?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 19 августа 2011

Я не уверен насчет XMLSimple, но вы можете использовать Nokogiri.Что-то вроде этого должно сработать:

def unpack_value(node)
    return node.text      if(node.node_name == 'string')
    return node.text.to_i if(node.node_name == 'integer')
    return true           if(node.node_name == 'true')
    return false          if(node.node_name == 'false')
    # etc.
end

doc = Nokogiri::XML('<xml>' + your_key_value_xml + '</xml>')
h   = doc.search('key').each_with_object({ }) { |n, h| h[n.text] = unpack_value(n.next_element) }

Если у вас в XML уже есть оболочка <xml>, вам не нужно добавлять их.

* *Вызов 1008 * даст вам итератор со всеми элементами <key>.Затем вы повторяете с each_with_object, чтобы построить хеш.Метод text дает вам содержимое узла, а next_element дает вам узел, который следует сразу за <key>, который у вас есть.Возможно, вам придется немного настроить unpack_value, чтобы учесть все возможные типы значений, но это довольно просто.

Этот подход перезапишет предыдущие <key> с новыми, но изменить его довольно легко.создайте массив маленьких хэшей с одним ключом, если вы хотите что-то сделать с дубликатами.

...