Ukoyg
Ukoyg translates Ruby Hashes to XML.
Ukoyg.xml(:find_user => { :id => 123, "v1:Key" => "api" })

Installation
Ukoyg is available through Rubygems and can be installed via:
$ gem install ukoyg
or add it to your Gemfile like this:
gem 'ukoyg', '~> 1.0'
Hash keys
Hash key Symbols are converted to lowerCamelCase Strings.
Ukoyg.xml(:lower_camel_case => "key")
You can change the default conversion formula to :camelcase
, :upcase
or :none
.
Note that options are passed as a second Hash to the .xml
method.
Ukoyg.xml({ :camel_case => "key" }, { :key_converter => :camelcase })
Hash key Strings are not converted and may contain namespaces.
Ukoyg.xml("XML" => "key")
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
Ukoyg escapes special characters unless the Hash key ends with an exclamation mark.
Ukoyg.xml(:escaped => "<tag />", :not_escaped! => "<tag />")
Self-closing tags
Hash Keys ending with a forward slash create self-closing tags.
Ukoyg.xml(:"self_closing/" => "", "selfClosing/" => nil)
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 the :order!
key.
Ukoyg.xml(:name => "Eve", :id => 1, :order! => [:id, :name])
XML attributes
Adding XML attributes is rather ugly, but it can be done by specifying an additional
Hash stored under the:attributes!
key.
Ukoyg.xml(:person => "Eve", :attributes! => { :person => { :id => 1 } })
Explicit XML Attributes
In addition to using the :attributes!
key, you may also specify attributes through keys beginning with an "@" sign.
Since you'll need to set the attribute within the hash containing the node's contents, a :content!
key can be used
to explicity set the content of the node. The :content!
value may be a String, Hash, or Array.
This is particularly useful for self-closing tags.
Using :attributes!
Ukoyg.xml(
"foo/" => "",
:attributes! => {
"foo/" => {
"bar" => "1",
"biz" => "2",
"baz" => "3"
}
}
)
Using "@" keys and ":content!"
Ukoyg.xml(
"foo/" => {
:@bar => "1",
:@biz => "2",
:@baz => "3",
:content! => ""
})
Example using "@" to get Array of parent tags each with @attributes & :content!
Ukoyg.xml(
"foo" => [
{:@name => "bar", :content! => 'ukoyg'}
{:@name => "baz", :@some => "attr", :content! => 'rocks!'}
])
Naturally, it would ignore :content! if tag is self-closing:
Ukoyg.xml(
"foo/" => [
{:@name => "bar", :content! => 'ukoyg'}
{:@name => "baz", :@some => "attr", :content! => 'rocks!'}
])
This seems a bit more explicit with the attributes rather than having to maintain a hash of attributes.
For backward compatibility, :attributes!
will still work. However, "@" keys will override :attributes!
keys
if there is a conflict.
Ukoyg.xml(:person => {:content! => "Adam", :@id! => 0})
Example with ":content!", :attributes! and "@" keys
Ukoyg.xml({
:subtitle => {
:@lang => "en",
:content! => "It's Godzilla!"
},
:attributes! => { :subtitle => { "lang" => "jp" } }
}
The example above shows an example of how you can use all three at the same time.
Notice that we have the attribute "lang" defined twice.
The @lang
value takes precedence over the :attribute![:subtitle]["lang"]
value.