I thought I'd start a small thread to give a bit of publicity to the excellent Ruby XML-Mapping library - I've not seen it mentioned often and its quite low down on the RubyForge listings - a shame, as it is a great way of working with XML.

Ruby has a great XML parser in the form of REXML. However, even with the greatest of XML parsers, XML parsing can be incredibly tedious, especially when you are working with the same XML data/schema on a regular basis. XML-Mapping solves this problem by enabling you to create native Ruby objects that map directly to your XML schema. Kind of like ActiveRecord for XML, thought not quite as "automatic" as ActiveRecord - a bit of config is still needed.

Here is a brief example. XML nodes can be mapped to native Ruby objects, including your own custom objects.

  <person id="001">
    <name>Luke Redpath</name>
    <job>Web Developer</job>
      <street>Some Street</street>
      <postcode>BH1 23X</postcode>
Now, to create our objects, we simply create the class definitions, include the XML-mapping library, and set out our mappings. Going by the example above, I'd say we have two custom objects, Person and Address, and the rest can be mapped to native types (people is an array, everything else is a string).

require 'xml/mapping'

# forward declarations
class Person; end;
class Address; end;

class Person
  include XML::Mapping

  numeric_node  :id, "@id"
  text_node  :name, "name"
  text_node  :job, "job"
  object_node  :address, "address", :class => Address

class Address
  include XML::Mapping
  text_node :street, "street"
  text_node :city, "city",
  text_node :postcode, "postcode"

# Example usage: 
person = Person.load_from_file("data.xml")
puts person.name
=> "Luke Redpath"
puts person.address.street
=> "Some Street"
For more examples and the api:

It can be installed as a gem:
gem install xml-mapping

Things that could be improved? It would be really cool if it could automatically determine the mappings from an XSD schema file if an XML file had one associated with it. That would make it as awesome as ActiveRecord.