Разбор файла libxml-ruby и получение необходимой информации из xml - PullRequest
0 голосов
/ 04 сентября 2011

Я использую libxml-ruby gem для чтения строки xml.

Я не могу извлечь необходимую информацию из строки XML.

В настоящее время у меня есть следующие xml

<?xml version="1.0" encoding="utf-8"?>
<message>
  <head>
    <api_key>252f5df2df522fg5fd25df2df5df2fd5</api_key>
    <user>123</user>
    <secret>********************</secret>
    <signature>****************</signature>
    <synchronization token="kj0s09ew090mv904v09409905b" last_synchronize_on="2010-01-02 11:30" />
  </head>
  <blockings>
    <blocking token="AAA" start_time="2010-01-01 10:00" end_time="2010-01-01 12:00" method="REQUEST" is_forced="FALSE" />
    <blocking token="BBB" start_time="2010-01-03 15:00" end_time="2010-01-03 18:00" method="REQUEST" is_forced="FALSE" />
  </blockings>
</message>

Как я могу получить значения api_key, токена синхронизации, last_synchronize_on из этой строки xml?

Как получить информацию об узлах блокировки внутри узла блокировки этой строки?

Спасибо

1 Ответ

4 голосов
/ 04 сентября 2011

Вы бы использовали LibXML :: XML :: Parser , чтобы получить LibXML :: XML :: Document :

p = LibXML::XML::Parser.file(xml_file)
# or p = LibXML::XML::Parser.string(xml_string)
doc = p.parse

Затем используйте find и немного XPath, чтобы найти ваши узлы:

api_key_node = doc.find('//api_key').first

Это дает вам LibXML::XML::Node в api_key_node, поэтому вы можете позвонить content, чтобы получить то, что вы хотите:

api_key = api_key_node.content
# "252f5df2df522fg5fd25df2df5df2fd5"

Аналогичные вещи применимы к синхронизации, но вы используете [] для доступа к значениям атрибута:

sync      = doc.find('//synchronization').first
token     = sync['token']
last_sync = sync['last_syncrhonize_on']

То же самое снова для узлов <blocking>, но вы бы перебирали их с each вместо использования first.

...