<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gabriele Lana &#187; roxi</title>
	<atom:link href="http://www.gabrielelana.it/archives/category/roxi/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gabrielelana.it</link>
	<description>on Agile Methodologies and Programming</description>
	<lastBuildDate>Sat, 04 Jun 2011 15:51:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ROXI vs XQuery</title>
		<link>http://www.gabrielelana.it/archives/24</link>
		<comments>http://www.gabrielelana.it/archives/24#comments</comments>
		<pubDate>Tue, 20 Mar 2007 22:01:15 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[roxi]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/24</guid>
		<description><![CDATA[L&#8217;intento di ROXI è quello di raggiungere un&#8217;espressività tale da rendere il meno doloroso possibile l&#8217;avere a che fare con dei documenti XML. Quale linguaggio migliore di XQuery per interrogare tali documenti? ROXI riesce a raggiungere la sua espressività? All&#8217;epoca mi sfidai a tradurre alcuni degli use case ufficiali del W3C in ROXI. Quello che [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;intento di <a href="http://code.google.com/p/roxi/">ROXI</a> è quello di raggiungere un&#8217;espressività tale da rendere il meno doloroso possibile l&#8217;avere a che fare con dei documenti XML. Quale linguaggio migliore di <a href="http://www.w3.org/TR/xquery/">XQuery</a> per interrogare tali documenti? ROXI riesce a raggiungere la sua espressività? All&#8217;epoca mi sfidai a tradurre alcuni degli <a href="http://www.w3.org/TR/xquery-use-cases">use case</a> ufficiali del W3C in ROXI. Quello che segue è un esempio del risultato.</p>
<p><span id="more-24"></span></p>
<p>Supponiamo di avere un file XML bib.xml</p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">&lt;?xml</span></span> version=<span style="color: #408800">"1.0"</span> encoding=<span style="color: #408800">"utf-8"</span><span style="font-weight: bold"><span style="color: #404040">?&gt;</span></span>
02: <span style="font-weight: bold"><span style="color: #404040">&lt;bib&gt;</span></span>
03:     <span style="font-weight: bold"><span style="color: #404040">&lt;book</span></span> <span style="color: #4088B8">year</span><span style="color: #FF0000">=</span><span style="color: #408800">"1994"</span><span style="font-weight: bold"><span style="color: #404040">&gt;</span></span>
04:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>TCP/IP Illustrated<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
05:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;&lt;last&gt;</span></span>Stevens<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;&lt;first&gt;</span></span>W.<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;&lt;/author&gt;</span></span>
06:         <span style="font-weight: bold"><span style="color: #404040">&lt;publisher&gt;</span></span>Addison-Wesley<span style="font-weight: bold"><span style="color: #404040">&lt;/publisher&gt;</span></span>
07:         <span style="font-weight: bold"><span style="color: #404040">&lt;price&gt;</span></span>65.95<span style="font-weight: bold"><span style="color: #404040">&lt;/price&gt;</span></span>
08:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
09:
10:     <span style="font-weight: bold"><span style="color: #404040">&lt;book</span></span> <span style="color: #4088B8">year</span><span style="color: #FF0000">=</span><span style="color: #408800">"1992"</span><span style="font-weight: bold"><span style="color: #404040">&gt;</span></span>
11:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>Advanced Programming in the Unix environment<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
12:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;&lt;last&gt;</span></span>Stevens<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;&lt;first&gt;</span></span>W.<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;&lt;/author&gt;</span></span>
13:         <span style="font-weight: bold"><span style="color: #404040">&lt;publisher&gt;</span></span>Addison-Wesley<span style="font-weight: bold"><span style="color: #404040">&lt;/publisher&gt;</span></span>
14:         <span style="font-weight: bold"><span style="color: #404040">&lt;price&gt;</span></span>65.95<span style="font-weight: bold"><span style="color: #404040">&lt;/price&gt;</span></span>
15:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
16:
17:     <span style="font-weight: bold"><span style="color: #404040">&lt;book</span></span> <span style="color: #4088B8">year</span><span style="color: #FF0000">=</span><span style="color: #408800">"2000"</span><span style="font-weight: bold"><span style="color: #404040">&gt;</span></span>
18:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>Data on the Web<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
19:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;&lt;last&gt;</span></span>Abiteboul<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;&lt;first&gt;</span></span>Serge<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;&lt;/author&gt;</span></span>
20:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;&lt;last&gt;</span></span>Buneman<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;&lt;first&gt;</span></span>Peter<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;&lt;/author&gt;</span></span>
21:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;&lt;last&gt;</span></span>Suciu<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;&lt;first&gt;</span></span>Dan<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;&lt;/author&gt;</span></span>
22:         <span style="font-weight: bold"><span style="color: #404040">&lt;publisher&gt;</span></span>Morgan Kaufmann Publishers<span style="font-weight: bold"><span style="color: #404040">&lt;/publisher&gt;</span></span>
23:         <span style="font-weight: bold"><span style="color: #404040">&lt;price&gt;</span></span>39.95<span style="font-weight: bold"><span style="color: #404040">&lt;/price&gt;</span></span>
24:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
25:
26:     <span style="font-weight: bold"><span style="color: #404040">&lt;book</span></span> <span style="color: #4088B8">year</span><span style="color: #FF0000">=</span><span style="color: #408800">"1999"</span><span style="font-weight: bold"><span style="color: #404040">&gt;</span></span>
27:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>The Economics of Technology and Content for Digital TV<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
28:         <span style="font-weight: bold"><span style="color: #404040">&lt;editor&gt;</span></span>
29:                <span style="font-weight: bold"><span style="color: #404040">&lt;last&gt;</span></span>Gerbarg<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;&lt;first&gt;</span></span>Darcy<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;</span></span>
30:                 <span style="font-weight: bold"><span style="color: #404040">&lt;affiliation&gt;</span></span>CITI<span style="font-weight: bold"><span style="color: #404040">&lt;/affiliation&gt;</span></span>
31:         <span style="font-weight: bold"><span style="color: #404040">&lt;/editor&gt;</span></span>
32:             <span style="font-weight: bold"><span style="color: #404040">&lt;publisher&gt;</span></span>Kluwer Academic Publishers<span style="font-weight: bold"><span style="color: #404040">&lt;/publisher&gt;</span></span>
33:         <span style="font-weight: bold"><span style="color: #404040">&lt;price&gt;</span></span>129.95<span style="font-weight: bold"><span style="color: #404040">&lt;/price&gt;</span></span>
34:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
35:
36: <span style="font-weight: bold"><span style="color: #404040">&lt;/bib&gt;</span></span>
</tt></pre>
<p>Lo use case <a href="http://www.w3.org/TR/xquery-use-cases/#xmp-queries-results-q6">1.1.9.6 Q6</a> &#8220;per ogni libro che possiede almeno un autore, estrarre come elementi il titolo e i primi due autori, ed eventualmente un elemento &#8220;et-al&#8221; vuoto se ci sono ulteriori autori&#8221; in XQuery viene implementato così</p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">&lt;bib&gt;</span></span>
02:   {
03:     <span style="font-weight: bold"><span style="color: #404040">for</span></span> <span style="color: #4088B8">$b</span> in <span style="font-weight: bold"><span style="color: #404040">doc</span></span>(<span style="color: #408800">"bib.xml"</span>)//book
04:     <span style="font-weight: bold"><span style="color: #404040">where</span></span> count(<span style="color: #4088B8">$b</span>/author) &gt; <span style="color: #FF0000">0</span>
05:     <span style="font-weight: bold"><span style="color: #404040">return</span></span>
06:         <span style="font-weight: bold"><span style="color: #404040">&lt;book&gt;</span></span>
07:             { <span style="color: #4088B8">$b</span>/title }
08:             {
09:                 <span style="font-weight: bold"><span style="color: #404040">for</span></span> <span style="color: #4088B8">$a</span> in <span style="color: #4088B8">$b</span>/author[position()&lt;=<span style="color: #FF0000">2</span>]
10:                 <span style="font-weight: bold"><span style="color: #404040">return</span></span> <span style="color: #4088B8">$a</span>
11:             }
12:             {
13:                 <span style="font-weight: bold"><span style="color: #404040">if</span></span> (count(<span style="color: #4088B8">$b</span>/author) &gt; <span style="color: #FF0000">2</span>)
14:                  <span style="font-weight: bold"><span style="color: #404040">then</span></span> <span style="font-weight: bold"><span style="color: #404040">&lt;et-al/&gt;</span></span>
15:                  <span style="font-weight: bold"><span style="color: #404040">else</span></span> ()
16:             }
17:         <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
18:   }
19: <span style="font-weight: bold"><span style="color: #404040">&lt;/bib&gt;</span></span>
</tt></pre>
<p>In ROXI invece può essere raggiunto lo stesso risultato in questo modo</p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">require</span></span> <span style="color: #408800">'roxi/xquery'</span>
02: <span style="font-weight: bold"><span style="color: #404040">include</span></span> <span style="color: #4088B8">ROXI</span>
03:
04: element <span style="color: #FF0000">=</span> <span style="color: #4088B8">XElement</span><span style="color: #FF0000">.</span>new<span style="color: #FF0000">(</span><span style="color: #408800">'bib'</span><span style="color: #FF0000">,</span>
05:   <span style="color: #4088B8">XQuery</span><span style="color: #FF0000">.</span>from<span style="color: #FF0000">(</span><span style="color: #4088B8">XDocument</span><span style="color: #FF0000">.</span>open<span style="color: #FF0000">(</span><span style="color: #408800">'bib.xml'</span><span style="color: #FF0000">).</span>xpath<span style="color: #FF0000">(</span><span style="color: #408800">'//book'</span><span style="color: #FF0000">))</span> <span style="font-weight: bold"><span style="color: #404040">do</span></span>
06:     where { <span style="color: #FF0000">|</span> book <span style="color: #FF0000">|</span> book<span style="color: #FF0000">.</span>children<span style="color: #FF0000">(</span><span style="color: #408800">'author'</span><span style="color: #FF0000">).</span>size <span style="color: #FF0000">&gt;</span> <span style="color: #FF0000">0</span> }
07:     select { <span style="color: #FF0000">|</span> book <span style="color: #FF0000">|</span>
08:       <span style="color: #4088B8">XElement</span><span style="color: #FF0000">.</span>new<span style="color: #FF0000">(</span><span style="color: #408800">'book'</span><span style="color: #FF0000">,</span>
09:         book<span style="color: #FF0000">.</span>child<span style="color: #FF0000">(</span><span style="color: #408800">'title'</span><span style="color: #FF0000">),</span>
10:         book<span style="color: #FF0000">.</span>xpath<span style="color: #FF0000">(</span><span style="color: #408800">'author[position()&lt;3]'</span><span style="color: #FF0000">),</span>
11:         <span style="font-weight: bold"><span style="color: #404040">if</span></span> <span style="color: #FF0000">(</span>book<span style="color: #FF0000">.</span>children<span style="color: #FF0000">(</span><span style="color: #408800">'author'</span><span style="color: #FF0000">).</span>size <span style="color: #FF0000">&gt;</span> <span style="color: #FF0000">2</span><span style="color: #FF0000">)</span>
12:           <span style="color: #4088B8">XElement</span><span style="color: #FF0000">.</span>new<span style="color: #FF0000">(</span><span style="color: #408800">'et-al'</span><span style="color: #FF0000">)</span>
13:         <span style="font-weight: bold"><span style="color: #404040">end</span></span>
14:       <span style="color: #FF0000">)</span>
15:     }
16:   <span style="font-weight: bold"><span style="color: #404040">end</span></span>
17: <span style="color: #FF0000">)</span>
</tt></pre>
<p>Considerando che è puro codice Ruby non è male vero? :-)</p>
<p>Entrambi producono lo stesso risultato</p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">&lt;bib&gt;</span></span>
02:     <span style="font-weight: bold"><span style="color: #404040">&lt;book&gt;</span></span>
03:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>TCP/IP Illustrated<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
04:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;</span></span>
05:             <span style="font-weight: bold"><span style="color: #404040">&lt;last&gt;</span></span>Stevens<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;</span></span>
06:             <span style="font-weight: bold"><span style="color: #404040">&lt;first&gt;</span></span>W.<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;</span></span>
07:         <span style="font-weight: bold"><span style="color: #404040">&lt;/author&gt;</span></span>
08:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
09:     <span style="font-weight: bold"><span style="color: #404040">&lt;book&gt;</span></span>
10:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>Advanced Programming in the Unix environment<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
11:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;</span></span>
12:             <span style="font-weight: bold"><span style="color: #404040">&lt;last&gt;</span></span>Stevens<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;</span></span>
13:             <span style="font-weight: bold"><span style="color: #404040">&lt;first&gt;</span></span>W.<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;</span></span>
14:         <span style="font-weight: bold"><span style="color: #404040">&lt;/author&gt;</span></span>
15:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
16:     <span style="font-weight: bold"><span style="color: #404040">&lt;book&gt;</span></span>
17:         <span style="font-weight: bold"><span style="color: #404040">&lt;title&gt;</span></span>Data on the Web<span style="font-weight: bold"><span style="color: #404040">&lt;/title&gt;</span></span>
18:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;</span></span>
19:             <span style="font-weight: bold"><span style="color: #404040">&lt;last&gt;</span></span>Abiteboul<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;</span></span>
20:             <span style="font-weight: bold"><span style="color: #404040">&lt;first&gt;</span></span>Serge<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;</span></span>
21:         <span style="font-weight: bold"><span style="color: #404040">&lt;/author&gt;</span></span>
22:         <span style="font-weight: bold"><span style="color: #404040">&lt;author&gt;</span></span>
23:             <span style="font-weight: bold"><span style="color: #404040">&lt;last&gt;</span></span>Buneman<span style="font-weight: bold"><span style="color: #404040">&lt;/last&gt;</span></span>
24:             <span style="font-weight: bold"><span style="color: #404040">&lt;first&gt;</span></span>Peter<span style="font-weight: bold"><span style="color: #404040">&lt;/first&gt;</span></span>
25:         <span style="font-weight: bold"><span style="color: #404040">&lt;/author&gt;</span></span>
26:         <span style="font-weight: bold"><span style="color: #404040">&lt;et-al/&gt;</span></span>
27:     <span style="font-weight: bold"><span style="color: #404040">&lt;/book&gt;</span></span>
28: <span style="font-weight: bold"><span style="color: #404040">&lt;/bib&gt;</span></span>
</tt></pre>
<p><strong>Nota</strong>: se volete utilizzare ROXI, <a href="http://code.google.com/p/roxi/">fatelo</a>, tenendo a mente che non è ancora stata rilasciata ufficialmente e quindi aspettatevi qualche problemuccio :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/24/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby + XML = ROXI</title>
		<link>http://www.gabrielelana.it/archives/15</link>
		<comments>http://www.gabrielelana.it/archives/15#comments</comments>
		<pubDate>Sat, 17 Mar 2007 13:36:20 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[roxi]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/15</guid>
		<description><![CDATA[L&#8217;altro giorno mi stavo facendo un giro e trovo questo pezzo di codice ruby

01: require 'net/http'
02: require 'rexml/document'
03:
04: # Web search for "madonna"
05: query = 'appid=YahooDemo&#38;query=madonna&#38;results=2'
06: url = "http://api.search.yahoo.com/WebSearchService/V1/webSearch?#{query}"
07:
08: # get the XML data as a string
09: xml_data = Net::HTTP.get_response(URI.parse(url)).body
10:
11: # extract event information
12: doc = REXML::Document.new(xml_data)
13: titles = []
14: links = []
15: doc.elements.each('ResultSet/Result/Title') do [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;altro giorno mi stavo facendo un giro e trovo <a href="http://developer.yahoo.com/ruby/ruby-xml.html">questo</a> pezzo di codice ruby</p>
<p><span id="more-15"></span></p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">require</span></span> <span style="color: #408800">'net/http'</span>
02: <span style="font-weight: bold"><span style="color: #404040">require</span></span> <span style="color: #408800">'rexml/document'</span>
03:
04: <span style="font-style: italic"><span style="color: #707070"># Web search for "madonna"</span></span>
05: query <span style="color: #FF0000">=</span> <span style="color: #408800">'appid=YahooDemo&amp;query=madonna&amp;results=2'</span>
06: url <span style="color: #FF0000">=</span> <span style="color: #408800">"http://api.search.yahoo.com/WebSearchService/V1/webSearch?#{query}"</span>
07:
08: <span style="font-style: italic"><span style="color: #707070"># get the XML data as a string</span></span>
09: xml_data <span style="color: #FF0000">=</span> <span style="color: #4088B8">Net::HTTP</span><span style="color: #FF0000">.</span>get_response<span style="color: #FF0000">(</span><span style="color: #4088B8">URI</span><span style="color: #FF0000">.</span>parse<span style="color: #FF0000">(</span>url<span style="color: #FF0000">)).</span>body
10:
11: <span style="font-style: italic"><span style="color: #707070"># extract event information</span></span>
12: doc <span style="color: #FF0000">=</span> <span style="color: #4088B8">REXML::Document</span><span style="color: #FF0000">.</span>new<span style="color: #FF0000">(</span>xml_data<span style="color: #FF0000">)</span>
13: titles <span style="color: #FF0000">=</span> <span style="color: #FF0000">[]</span>
14: links <span style="color: #FF0000">=</span> <span style="color: #FF0000">[]</span>
15: doc<span style="color: #FF0000">.</span>elements<span style="color: #FF0000">.</span>each<span style="color: #FF0000">(</span><span style="color: #408800">'ResultSet/Result/Title'</span><span style="color: #FF0000">)</span> <span style="font-weight: bold"><span style="color: #404040">do</span></span> <span style="color: #FF0000">|</span>ele<span style="color: #FF0000">|</span>
16:    titles <span style="color: #FF0000">&lt;&lt;</span> ele<span style="color: #FF0000">.</span>text
17: <span style="font-weight: bold"><span style="color: #404040">end</span></span>
18: doc<span style="color: #FF0000">.</span>elements<span style="color: #FF0000">.</span>each<span style="color: #FF0000">(</span><span style="color: #408800">'ResultSet/Result/Url'</span><span style="color: #FF0000">)</span> <span style="font-weight: bold"><span style="color: #404040">do</span></span> <span style="color: #FF0000">|</span>ele<span style="color: #FF0000">|</span>
19:    links <span style="color: #FF0000">&lt;&lt;</span> ele<span style="color: #FF0000">.</span>text
20: <span style="font-weight: bold"><span style="color: #404040">end</span></span>
21:
22: <span style="font-style: italic"><span style="color: #707070"># print all events</span></span>
23: titles<span style="color: #FF0000">.</span>each_with_index <span style="font-weight: bold"><span style="color: #404040">do</span></span> <span style="color: #FF0000">|</span>title<span style="color: #FF0000">,</span> idx<span style="color: #FF0000">|</span>
24:    print <span style="color: #408800">"#{title} =&gt; #{links[idx]}\n"</span>
25: <span style="font-weight: bold"><span style="color: #404040">end</span></span>
</tt></pre>
<p>E&#8217; un esempio su come utilizzare Ruby per interrogare le API di Yahoo! e come successivamente elaborare il risultato per ricavare i dati di interesse, in particolare quest&#8217;ultimo obiettivo viene raggiunto utilizzando la libreria <a href="http://www.germane-software.com/software/rexml/">REXML</a> (la libreria inclusa in Ruby per l&#8217;elaborazione di documenti XML), e mi sono ricordato del perchè ne ho scritta una mia&#8230; ma andiamo con ordine</p>
<p>L&#8217;anno scorso sono stato incaricato da un&#8217;associazione culturale che ha sedi in tutto il mondo di realizzare un&#8217;applicazione per permettere ad ogni sede di poter gestire autonomamente (ma senza perdere l&#8217;uniformità fra sedi) sia il proprio sito (sottodominio) internet sia la propria intranet. Ero felicissimo in quanto avrei potuto realizzare dei sogni/progetti che tenevo nel cassetto da un po&#8217; di tempo:</p>
<ul>
<li>Studiare (bene) Ruby</li>
<li>Realizzare un <a href="http://en.wikipedia.org/wiki/Structured_wiki">wiki strutturato</a></li>
<li>Rilasciare un lavoro, per il quale sarei stato pagato, sotto licenza GPL (non essendo un&#8217;associazione a fini di lucro ero riuscito a convincerli)</li>
</ul>
<p>Purtroppo il sogno è durato poco e il progetto è stato sospeso per questioni politiche, ma parte del lavoro è stata salvata, fra cui una libreria per l&#8217;elaborazione di documenti XML scritta in Ruby e in C che ho chiamato <a href="http://ruby-it.org/pages/Roxi">ROXI</a></p>
<p><em>Gabriele, Gabriele, Gabriele, ma che agilista sei? Che fine hanno fatto le tue prediche su <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">NIH</a>, <a href="http://en.wikipedia.org/wiki/You_Aren%27t_Gonna_Need_It">YAGNI</a> e <a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a>? Avevi già una libreria in Ruby per fare tutto quello che ti serviva, perchè ne hai scritta una tu?</em></p>
<p>Sarei un bugiardo se dicessi che non mi sono divertito a scrivere ROXI, ma vi assicuro che no ho avuto proprio bisogno, perchè REXML è:</p>
<ul>
<li>Leeeeenta</li>
<li>Non sfrutta a pieno la potenza espressiva di Ruby (diciamo che l&#8217;ho trovata poco idiomatica)</li>
<li>Non implementa gli standard che dice di implementare</li>
</ul>
<p>Sugli altri punti avrei potuto anche sorvolare, ma l&#8217;ultimo è stato davvero troppo penalizzante, sopratutto per quanto riguarda l&#8217;implementazione di <a href="http://www.w3.org/TR/xpath">XPath</a> che è veramente lontana dallo standard <a href="http://www.w3.org/TR/xpath">1.0</a>, non parliamo del <a href="http://www.w3.org/TR/xpath20/">2.0</a>. Mi sono detto <em>&#8220;poco male, è un progetto open source, posso aggiustarlo e poi riconsegnarlo alla comunità&#8221;</em>, poi ho iniziato a studiarmi i sorgenti e ho trovato questo (src/rexml/parsers/xpathparser.rb)</p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">require</span></span> <span style="color: #408800">'rexml/namespace'</span>
02: <span style="font-weight: bold"><span style="color: #404040">require</span></span> <span style="color: #408800">'rexml/xmltokens'</span>
03:
04: <span style="font-weight: bold"><span style="color: #404040">module</span></span> <span style="color: #4088B8">REXML</span>
05:   <span style="font-weight: bold"><span style="color: #404040">module</span></span> <span style="color: #4088B8">Parsers</span>
06:     <span style="font-style: italic"><span style="color: #707070"># You don't want to use this class.  Really.  Use XPath, which is a wrapper</span></span>
07:     <span style="font-style: italic"><span style="color: #707070"># for this class.  Believe me.  You don't want to poke around in here.</span></span>
08:     <span style="font-style: italic"><span style="color: #707070"># There is strange, dark magic at work in this code.  Beware.  Go back!  Go</span></span>
09:     <span style="font-style: italic"><span style="color: #707070"># back while you still can!</span></span>
10:
11:     <span style="font-weight: bold"><span style="color: #404040">class</span></span> <span style="color: #4088B8">XPathParser</span>
12:       <span style="font-style: italic"><span style="color: #707070"># ... more more and more flatten code</span></span>
13:     <span style="font-weight: bold"><span style="color: #404040">end</span></span>
14:   <span style="font-weight: bold"><span style="color: #404040">end</span></span>
15: <span style="font-weight: bold"><span style="color: #404040">end</span></span>
</tt></pre>
<p>Al che ho desistito e ho iniziato a scrivermi una libreria che risolvesse anche gli altri due problemi che avevo riscontrato</p>
<p><em>Cosa c&#8217;entra il codice che hai mostrato all&#8217;inizio?</em></p>
<p>C&#8217;entra per il semplice fatto che è sbagliato! Non tanto per il risultato che <strong>in questo caso</strong> può essere giusto, ma è sbagliato per lo standard XML/XPath, infatti se date un occhio all&#8217;XML restituito dall&#8217;url</p>
<pre class="code"><tt>1: <span style="font-weight: bold"><span style="color: #404040">&lt;?xml</span></span> version=<span style="color: #408800">"1.0"</span> encoding=<span style="color: #408800">"UTF-8"</span><span style="font-weight: bold"><span style="color: #404040">?&gt;</span></span>
2: <span style="font-weight: bold"><span style="color: #404040">&lt;ResultSet</span></span> <span style="color: #4088B8">xmlns:xsi</span><span style="color: #FF0000">=</span><span style="color: #408800">"http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #4088B8">xmlns</span><span style="color: #FF0000">=</span><span style="color: #408800">"urn:yahoo:srch"</span><span style="font-weight: bold"><span style="color: #404040">&gt;</span></span>
3:         <span style="font-weight: bold"><span style="color: #404040">&lt;Result&gt;</span></span>
4:                 <span style="font-weight: bold"><span style="color: #404040">&lt;Title&gt;</span></span>Madonna<span style="font-weight: bold"><span style="color: #404040">&lt;/Title&gt;</span></span>
5:                 <span style="font-weight: bold"><span style="color: #404040">&lt;Url&gt;</span></span>http://www.madonna.com<span style="font-weight: bold"><span style="color: #404040">&lt;/Url&gt;</span></span>
6:                 ...
7:         <span style="font-weight: bold"><span style="color: #404040">&lt;/Result&gt;</span></span>
8:         ...
9: <span style="font-weight: bold"><span style="color: #404040">&lt;/ResultSet&gt;</span></span>
</tt></pre>
<p>Tutti gli elementi per i quali non è indicato il namespace sono da considerarsi nel namespace di default (urn:yahoo:srch), quindi le query XPath fatte con REXML alla linea 15 e 18 non dovrebbero restituire niente! Per questo esempietto non è un grosso problema, ma provate ad immaginarvi cosa significherebbe scoprire tutte queste &#8220;piccole&#8221; diversità dallo standard sulla pelle di un&#8217;applicazione da decine di migliaia di linee di codice :-)</p>
<p>Lo stesso esempio scritto utilizzando ROXI e volendo aderire allo standard XPath</p>
<pre class="code"><tt>01: <span style="font-weight: bold"><span style="color: #404040">require</span></span> <span style="color: #408800">'roxi/xpath'</span>
02: <span style="font-weight: bold"><span style="color: #404040">include</span></span> <span style="color: #4088B8">ROXI</span>
03:
04: query <span style="color: #FF0000">=</span> <span style="color: #408800">'appid=YahooDemo&amp;query=madonna&amp;results=2'</span>
05: url <span style="color: #FF0000">=</span> <span style="color: #408800">"http://api.search.yahoo.com/WebSearchService/V1/webSearch?#{query}"</span>
06:
07: context <span style="color: #FF0000">=</span> <span style="color: #4088B8">XPath::Context</span><span style="color: #FF0000">.</span>new
08: context<span style="color: #FF0000">.</span>namespaces<span style="color: #FF0000">[</span><span style="color: #408800">'yh'</span><span style="color: #FF0000">]</span> <span style="color: #FF0000">=</span> <span style="color: #408800">'urn:yahoo:srch'</span>
09:
10: <span style="color: #4088B8">XDocument</span><span style="color: #FF0000">.</span>uri<span style="color: #FF0000">(</span>url<span style="color: #FF0000">).</span>xpath<span style="color: #FF0000">(</span><span style="color: #408800">'/yh:ResultSet/yh:Result[yh:Title][yh:Url]'</span><span style="color: #FF0000">,</span> context<span style="color: #FF0000">).</span>each <span style="font-weight: bold"><span style="color: #404040">do</span></span> <span style="color: #FF0000">|</span> result <span style="color: #FF0000">|</span>
11:   puts <span style="color: #408800">"#{result.child('Title').value} =&gt; #{result.child('Url').value}"</span>
12: <span style="font-weight: bold"><span style="color: #404040">end</span></span>
</tt></pre>
<p>Se invece possiamo concederci qualche libertà possiamo utilizzare un&#8217;estensione dello standard stesso per ottenere una versione più compatta</p>
<pre class="code"><tt>1: query <span style="color: #FF0000">=</span> <span style="color: #408800">'//{urn:yahoo:srch}:Result[{urn:yahoo:srch}:Title][{urn:yahoo:srch}:Url]'</span>
2:
3: <span style="color: #4088B8">XDocument</span><span style="color: #FF0000">.</span>uri<span style="color: #FF0000">(</span>url<span style="color: #FF0000">).</span>xpath<span style="color: #FF0000">(</span>query<span style="color: #FF0000">).</span>each <span style="font-weight: bold"><span style="color: #404040">do</span></span> <span style="color: #FF0000">|</span> result <span style="color: #FF0000">|</span>
4:   puts <span style="color: #408800">"#{result.child('Title').value} =&gt; #{result.child('Url').value}"</span>
5: <span style="font-weight: bold"><span style="color: #404040">end</span></span>
</tt></pre>
<p>Ovvero invece che specificare prima il contesto di ricerca (label => namespace url) è possibile specificare l&#8217;url direttamente nella query (utile in caso l&#8217;url non sia troppo complessa)</p>
<p>Vi racconto tutto questo perchè mi sono venuti i rimorsi di coscienza: sono stato pagato, ho ottenuto una libreria che ha il suo perchè, ma l&#8217;ho tenuta a fare la muffa sul mio HD. Poco tempo fa <a href="http://liquiddevelopment.blogspot.com/">Chiaroscuro</a> mi ha fatto ricordare di ROXI e in cuor mio ho deciso di rimetterci mano per rilasciarla alla comunità, ma non prima di qualche piccolo ritocco (ovviamente in ordine di priorità)</p>
<ul>
<li>Riscrivere il parser XML in Ruby (attualmente è un parser pull scritto in C)</li>
<li>Riscrivere il parser XPath in Ruby (attualmente e&#8217; un parser scritto in C generato con Bison)</li>
<li>Implementare il metodo di validazione <a href="http://www.schematron.com/">schematron</a></li>
<li>Completare il parco delle <a href="http://www.exslt.org/">estensioni</a> alle funzioni XPath standard</li>
</ul>
<p>La riscrittura dei parser è imperativa. Ad oggi se uno vuole velocità può utilizzare <a href="http://libxml.rubyforge.org/">libxml</a> e vivere felice, il mio obiettivo invece è quello di realizzare un&#8217;alternativa a REXML, che sia aderente agli standard <a href="http://www.w3.org/">W3C</a> e che sia scritta solo in Ruby, in vista anche dell&#8217;uscita di <a href="http://www.atdot.net/yarv/">YARV</a></p>
<p><del datetime="2007-03-18T12:34:02+00:00">Se qualcuno volesse dare una mano o solo vedere il codice mi mandi una mail (info at gabrielelana dot it)</del></p>
<p>Ho creato un <a href="http://code.google.com/p/roxi/">progetto</a> su <a href="http://code.google.com">GoogleCode</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/15/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

