Ruby 2.2 Использование REXML

Я просмотрел множество руководств по Ruby 2.2 и REXML. Это пример моего xml:

<msg user='Karim'><body action='ChkUsername' r='0'><ver v='153' /></body></msg>

И это то, что у меня сейчас есть в виде кода:

        xml =    "<msg user='Karim'><body action='ChkUsername' r='0'><ver v='153' /></body></msg>"
        doc = Document.new xml
        puts doc.root.attributes[action]

Это не сработает. Выскакивает ошибка. неопределенная локальная переменная или метод «действие» для # {classname} (NameError)


person Jad    schedule 14.04.2015    source источник


Ответы (1)


Вы не можете случайным образом предположить существование переменных. Маркер action будет интерпретироваться как ссылка (например, вызов переменной или метода), поскольку он не является строкой или символом. У вас нет этой переменной или метода, поэтому вы получаете сообщение об ошибке, указывающее, что именно не так.

puts doc.root.attributes['action']

Корень вашего документа — это тег <msg>. Тег <msg> не имеет атрибут action. Он имеет атрибут user, доступный, как и следовало ожидать:

 > require 'rexml/document'
 > xml = "<msg user='Karim'><body action='ChkUsername' r='0'><ver v='153' /></body></msg>"
 > doc = REXML::Document.new(xml)
 > doc.root.attributes['user']
=> "Karim"

Атрибут action вложен дальше в документ, в элемент <body>.

Существует несколько способов опроса документа (все они описаны в руководстве, кстати), например,

 > doc.elements.each('//body') do |body|
 >   puts body.attributes['action']
 > end
ChkUsername
person Dave Newton    schedule 14.04.2015
comment
как я мог тогда вызвать атрибут действия? - person Jad; 14.04.2015
comment
@Jad ... Как я сказал тебе в ответ? - person Dave Newton; 14.04.2015
comment
ой ладно извините. Это по-прежнему дает неопределенную локальную переменную или метод «действие» для # {classname} (NameError) - person Jad; 14.04.2015
comment
@Jad Это невозможно; action - это непосредственная строка в коде в моем ответе. - person Dave Newton; 14.04.2015
comment
Как это невозможно? Может быть, я неправильно обращаюсь к атрибуту? - person Jad; 14.04.2015
comment
Неважно. Кажется, у меня была проблема в другом месте. Так вот, это даже не дает ценности действия. Это ничего не дает. Никаких ошибок не показывает. - person Jad; 14.04.2015
comment
@Jad Потому что в корне документа нет атрибута action. Я не уверен, серьезно вы говорите или нет; Я исправляю свой ответ, чтобы притвориться, что это учебник. Я бы серьезно подумал о том, чтобы сделать учебник по REXML, хотя, похоже, вы пытаетесь пропустить несколько шагов. - person Dave Newton; 14.04.2015
comment
Большое спасибо. Я наконец понял это. - person Jad; 14.04.2015