Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Ruby: XML:n käsittely REXML-rajapinnalla

kayttaja-2791 [08.08.2006 22:22:10]

#

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>

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta