Ruby, Scala and XML

I’ve been programming fair bit in Ruby lately, but I’ve had my eye on Scala as well. It’s XML support (not to mention integration with Java) makes it a tempting platform. Here’s an example of Ruby with REXML:



  require 'rexml/document'
  include REXML

  xml = Document.new(File.open("hydrogen.atom"))
  id = xml.elements["//id"][0]
  puts id

Now for the Scala


  import scala.xml.XML

  object AtomTest {

    val doc = XML.loadFile("hydrogen.atom")
    val id = (doc \ "id")(0)

    def main(args: Array[String]) = 
         Console.println(id)

  }

Pretty similiar, eh? Well here are two great things about Scala: first, we can inline the XML as so:


  import scala.xml.XML

  object AtomTest {

  val doc = 
    <entry xmlns="http://www.w3.org/2005/Atom" 
           xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
           xmlns:dc="http://purl.org/dc/elements/1.1/">
      <title>A simple Atom test</title>
      <id>http://localhost/sandbox/hydrogen</id>
      <updated>2007-04-05T12:30:00Z</updated>
      <author>
    <name>root</name>
    <uri>http://localhost:3000/users/root</uri>
    <email>farra@localhost</email>
      </author>
      <content type="application/rdf+xml">
        <rdf:Description rdf:ID="http://localhost/sandbox/hydrogen">
          <dc:comment>This is just a comment</dc:comment>
          <dc:description>The simplest atom is hydrogen</dc:description>
        </rdf:Description>         
      </content>
    </entry>;

   val id = (doc \ "id")(0)
   def main(args: Array[String]) =  Console.println(id)

  }

Now let’s look at one other difference between the two. Notice we’re outputting the entire element, not just its text. The Ruby output is this:


  <id>http://localhost/sandbox/hydrogen</id>

But with scala, our output is this (prettied up a bit):


  <id xmlns:dc="http://purl.org/dc/elements/1.1/" 
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
      xmlns="http://www.w3.org/2005/Atom">
        http://localhost/sandbox/hydrogen
  </id>

Scala maintains the XML namespaces! Sweet!