Harjoitus jossa opettelin käyttämään Rubyn (hienoa) XML-rajanpintaa, REXML:ää (tulee oletuksena uusien Rubyjen matkassa). Ohjelma avaa halutut XML:t, ottaa niiden juurielementit, ja käy attribuutit lävitse, kuten myös elementit (jonka attribuutit ja elementit se taas käy läpi, rekursiivisesti, jne). Tulostuksen muotoilu on aika huonon näköistä, mutta ei tätä koodia pelkästään näin olekaan tarkoitettu käytettäväksi, kunhan vain harjoittelin, ja ajattelin julkaista (osasyynä erittäin vähäinen suomenkielinen Ruby-materiaali).
Mitään hienoa lisenssiä en näin yleisluontoiselle harjoitukselle jaksa väsätä, käyttää kuka tahtoo, ja miten tahtoo :). Jos on jotain kysyttävää niin kysyä sopii, vaikka kyllä olenkin aloittelija vielä tämän(kin) kielen kanssa.
require 'rexml/document' include REXML def output_element(element, deep = 0) print "\t" * deep + element.name + ":" #Tulostetaan elementin mahdollinen teksti (<element>text</element>) if (element.has_text? == true && element.text.strip.empty? == false) print " " + element.text.strip end puts " {" #Tulostetaan attribuutit (<element attribute="attValue"></element>) if (element.has_attributes? == true) element.attributes.each { |attName, attValue| puts "\t" * (deep + 1) + attName + " => " + attValue } end #Tulostetaan elementit (rekursiivisesti) if (element.has_elements? == true) element.elements.each {|element| output_element(element, deep + 1) } end puts "\t" * deep + "}" end #Käydään lävitse annetut xml-filut if (ARGV.empty? == false) ARGV.each { |xmlFile| puts "\n=== " + xmlFile + " ===" file = File.new(xmlFile) xmlDoc = Document.new(file) xmlRoot = xmlDoc.root output_element(xmlRoot) } else puts "Usage: ruby " + $0 + " xmlfile1.xml xmlfile2.xml xmlfile3.xml ..." end
Esimerkki-XML
Haettu Wikipediasta, lisenssi GFDL (http://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License).
<?xml version="1.0" encoding="UTF-8"?> <recipe name="bread" prep_time="5 mins" cook_time="3 hours"> <title>Basic bread</title> <ingredient amount="3" unit="cups">Flour</ingredient> <ingredient amount="0.25" unit="ounce">Yeast</ingredient> <ingredient amount="1.5" unit="cups" state="warm">Water</ingredient> <ingredient amount="1" unit="teaspoon">Salt</ingredient> <instructions> <step>Mix all ingredients together, and knead thoroughly.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Knead again, place in a tin, and then bake in the oven.</step> </instructions> </recipe>
Aihe on jo aika vanha, joten et voi enää vastata siihen.