Cómo crear un objeto XML a partir de una cadena usando mapeo xml en Ruby

Estoy usando mapeo xml en Ruby (en Sinatra) para algunas cosas XML. Generalmente sigo este tutorial: http://xml-mapping.rubyforge.org/. Puedo crear objetos y escribirlos en cadenas XML usando

login.save_to_xml.to_s

Pero cuando lo intento

login = Login.load_from_xml(xml_string)

Obtuve el siguiente error:

XML::MappingError - no value, and no default value: Attribute username not set (XXPathError: path not found: username):

Aquí está la cadena XML que recibo:

<login><username>ali</username><password>baba</password></login>

Así es como se ve la clase:

class Login
  include XML::Mapping

  text_node :username, "username"
  text_node :password, "password"
end

Entonces, el nombre de la clase es el mismo, los nodos tienen el mismo nombre. De hecho, obtengo exactamente la misma cadena cuando creo una instancia de mi objeto y la lleno con ali / baba:

test = Login.new
test.username = "ali"
test.password = "baba"
p test.save_to_xml.to_s

<login><username>ali</username><password>baba</password></login>

¿Qué me estoy perdiendo?

Gracias, MrB

EDIT:

Cuando lo hago

test = login.save_to_xml

Y entonces

login = Login.load_from_xml(test)

funciona. Entonces, el problema parece ser que estoy pasando una cadena, mientras que el método espera ... bueno, algo más. Definitivamente hay un método load_from_xml (cadena) en rubydocs, así que no estoy seguro de qué pasar aquí. Supongo que necesito algún tipo de to_s al revés.

preguntado el 16 de mayo de 11 a las 20:05

1 Respuestas

Parece que save_to_xml crea un elemento REXML ::. Dado que eso funciona, es posible que desee probar:

Login.load_from_xml(REXML::Document.new(xml_string).root)

Consulte la sección sobre "choice_node" para obtener un ejemplo más detallado. http://xml-mapping.rubyforge.org/

contestado el 17 de mayo de 11 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.