Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…
Cannot retrieve contributors at this time
71 lines (45 sloc) 2.09 KB


Gyoku translates Ruby Hashes to XML.

Bugs | Docs


The gem is available through Rubygems and can be installed via:

$ gem install gyoku

An example

Gyoku.xml :find_user => { :id => 123, "wsdl:Key" => "api" }
# => "<findUser><id>123</id><wsdl:Key>api</wsdl:Key></findUser>"

As you might notice, Gyoku follows a couple of conventions for translating Hashes into XML.


Hash keys

  • Symbols are converted to lowerCamelCase Strings
  • Strings are not converted and may contain namespaces

Hash values

  • DateTime objects are converted to xs:dateTime Strings
  • Objects responding to :to_datetime (except Strings) are converted to xs:dateTime Strings
  • TrueClass and FalseClass objects are converted to "true" and "false" Strings
  • NilClass objects are converted to xsi:nil tags
  • These conventions are also applied to the return value of objects responding to :call
  • All other objects are converted to Strings using :to_s

Special characters

Gyoku escapes special characters unless the Hash key ends with an exclamation mark:

Gyoku.xml :escaped => "<tag />", :not_escaped! => "<tag />"
# => "<escaped>&lt;tag /&gt;</escaped><notEscaped><tag /></notEscaped>"

Self-closing tags

Hash Keys ending with a forward slash create self-closing tags:

Gyoku.xml :"self_closing/" => "", "selfClosing/" => nil
# => "<selfClosing/><selfClosing/>"

Sort XML tags

In case you need the XML tags to be in a specific order, you can specify the order through an additional Array stored under an :order! key:

Gyoku.xml :name => "Eve", :id => 1, :order! => [:id, :name]
# => "<id>1</id><name>Eve</name>"

XML attributes

Adding XML attributes is rather ugly, but it can be done by specifying an additional Hash stored under an :attributes! key:

Gyoku.xml :person => "Eve", :attributes! => { :person => { :id => 1 } }
# => "<person id=\"1\">Eve</person>"
Jump to Line
Something went wrong with that request. Please try again.