<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>TataBlog</title>
	
	<link>http://blog.tatablack.net</link>
	<description>Musings on code, life and everything</description>
	<lastBuildDate>Sun, 25 Jul 2010 08:55:56 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CodeRamblings" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="coderamblings" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">CodeRamblings</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Sezioni CDATA con XmlBeans</title>
		<link>http://blog.tatablack.net/2008/05/17/sezioni-cdata-con-xmlbeans/</link>
		<comments>http://blog.tatablack.net/2008/05/17/sezioni-cdata-con-xmlbeans/#comments</comments>
		<pubDate>Sat, 17 May 2008 11:00:33 +0000</pubDate>
		<dc:creator>TataBlack</dc:creator>
				<category><![CDATA[Codice]]></category>
		<category><![CDATA[cdata]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[xmlbeans]]></category>

		<guid isPermaLink="false">http://blog.tatablack.net/?p=4</guid>
		<description><![CDATA[Le sezioni CDATA rappresentano, per le librerie di serializzazione Java &#60;-&#62; Xml, una questione fastidiosa. Non sono marcatori veri e propri, e nel recuperare il contenuto testuale di un nodo vengono ignorate. Il problema sorge nel momento in cui una libreria deve convertire un oggetto in una stringa Xml; per ogni nodo da creare, le [...]]]></description>
			<content:encoded><![CDATA[<p>Le sezioni <a href="http://www.w3.org/TR/xml/#sec-cdata-sect">CDATA</a> rappresentano, per le librerie di serializzazione Java &lt;-&gt; Xml, una questione fastidiosa. Non sono marcatori veri e propri, e nel recuperare il contenuto testuale di un nodo vengono ignorate. Il problema sorge nel momento in cui una libreria deve convertire un oggetto in una stringa Xml; per ogni nodo da creare, le opzioni possibili sono quattro:</p>
<ol>
<li>ignorare i dettagli del contenuto del nodo, e serializzarlo così come è stato valorizzato &#8211; questo espone al rischio di produrre in output xml malformato;</li>
<li>racchiudere <em>sempre</em> il contenuto di un nodo in una sezione CDATA; anche questo non è un comportamento ottimale, dal momento che 1) non sempre tale sezione è realmente necessaria, e inoltre 2) aumenta le dimensioni dell&#8217;output. In certi contesti d&#8217;uso questo può rappresentare un problema significativo;</li>
<li>analizzare il contenuto del nodo e sostituire, ove necessario, determinati caratteri con le corrispondenti <em>entities</em> (ad es. <code>&lt;</code>) o <em>character references</em> (ad es. <code>&amp;#nnn;</code>, dove <code>nnn</code> è l&#8217;identificativo Unicode del carattere);</li>
<li>analizzare il contenuto del nodo e, se presenti caratteri che richiederebbero una sostituzione, racchiudere il tutto in una sezione CDATA.</li>
</ol>
<p>XmlBeans consente di gestire esplicitamente il contenuto dei nodi durante la serializzazione solo a partire dalla versione <a href="http://xmlbeans.apache.org/#N10036">2.3.0</a>, tramite due opzioni configurabili con la classe <code>XmlOptions</code> (con i metodi <code>setSaveCDataLengthThreshold</code> e <code>setSaveCDataEntityCountThreshold</code>).</p>
<p>L&#8217;ultima release disponibile del ramo di sviluppo precedente, ovvero la 1.0.4, decide invece unilateralmente quando racchiudere il contenuto di un nodo in una sezione CDATA e quando, invece, limitarsi a sostituire i caratteri che contiene. Di fatto, si tratta di una combinazione delle opzioni 3) e 4) sopra esposte.</p>
<p>L&#8217;<a href="http://markmail.org/message/hu4mxmzr4i6pepba?q=xmlbeans+CDATA+Heuristic">algoritmo utilizzato</a> è, dunque, abbastanza arbitrario (per i curiosi, è implementato nel metodo privato <code>entitizeContent</code>, nella inner class <code>Parse</code>, all&#8217;interno della classe <code>org.apache.xmlbeans.impl.store.Saver</code>). In due parole, questa versione di XmlBeans inserisce delle sezioni CDATA solo se:</p>
<ul>
<li>il testo contenuto nel nodo supera i 32 caratteri;</li>
<li>tale testo contiene almeno 6 caratteri che andrebbero trasformati in entities;</li>
<li>i caratteri da trasformare costituiscono più dell&#8217;un per cento del testo totale.</li>
</ul>
<p>In tutti gli altri casi, via di <code>entitizeContent</code>.</p>
<p>Essendomi trovato a dover utilizzare proprio questa versione della libreria (condivisa da diversi gruppi di lavoro), ho cercato un escamotage di qualche tipo.</p>
<p>Il risultato è il seguente:</p>
<pre name="code" class="java:nogutter">public static void main(String[] args) throws Exception {
	/* Our test XML */
	String xml = "&lt;root&gt;&lt;first&gt;&lt;/first&gt;&lt;second&gt;&lt;/second&gt;&lt;/root&gt;";

	/* Let's build our XmlObject based
	 * on the XML string just defined */
	XmlObject xmlObject = XmlObject.Factory.parse(xml);

	/* The problematic content */
	String content = "Ampersand and less-than: &amp; &lt;";

	/* We'll add this content through a cursor */
	XmlCursor cursor = xmlObject.newCursor();
	cursor.toNextToken();
	cursor.toChild("first");

	/* The first node shall have our "raw" content */
	cursor.setTextValue(content);

	/* The second node shall have our content
	 * in a CDATA section */
	cursor.toNextSibling();
	cursor.setTextValue(XmlHelper.insertCDATATrigger(content));

	/* Here's the result */
	System.out.println(XmlHelper.getStringFromXmlBean(xmlObject));

	/*
	 * &lt;root&gt;
	 *   &lt;first&gt;Ampersand and less-than: &amp; &lt;&lt;/first&gt;
	 *   &lt;second&gt;&lt;![CDATA[Ampersand and less-than: &amp; &lt;]]&gt;&lt;/second&gt;
	 * &lt;/root&gt;
	 */
}</pre>
<p>Ogni volta che devo impostare il contenuto di un nodo, e voglio che venga racchiuso in una sezione CDATA, utilizzo il metodo <code>insertCDATATrigger</code>. Per serializzare il bean, utilizzo <code>getStringFromXmlBean</code> (a me serviva in output una stringa, ma il sistema è valido anche se usate uno degli <a href="http://xmlbeans.apache.org/docs/1.0.4/reference/org/apache/xmlbeans/XmlTokenSource.html#save(org.xml.sax.ContentHandler,%20org.xml.sax.ext.LexicalHandler)">altri</a> metodi <code>save</code>).</p>
<p>Il file completo lo trovate qui: <a class="downloadlink" href="http://blog.tatablack.net/wp-content/plugins/download-monitor/download.php?id=XmlHelper.java" title=" downloaded 582 times" >XmlHelper.java (582) - 4.45 KB</a></p>
<p>L&#8217;eleganza della soluzione è opinabile&#8230; ma, a meno di voler re-implementare la serializzazione, o modificare il codice degli XmlBean utilizzati (che, per inciso, non esiste, dal momento che preferisco generare direttamente le classi a partire da file .xsd), mi è sembrata quella più sensata.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tatablack.net/2008/05/17/sezioni-cdata-con-xmlbeans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protetto: Vodafone 190 Utils</title>
		<link>http://blog.tatablack.net/2008/04/30/vodafone-190-utils/</link>
		<comments>http://blog.tatablack.net/2008/04/30/vodafone-190-utils/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 05:00:07 +0000</pubDate>
		<dc:creator>TataBlack</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[etnoteam]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[vodafone]]></category>

		<guid isPermaLink="false">http://blog.tatablack.net/?p=6</guid>
		<description><![CDATA[Non vi è alcun riassunto in quanto si tratta di un articolo protetto.]]></description>
			<content:encoded><![CDATA[<form action="http://blog.tatablack.net/wp-pass.php" method="post">
<p>Questo post è protetto da password. Per leggerlo inserire la password qui sotto:</p>
<p><label for="pwbox-6">Password:<br />
<input name="post_password" id="pwbox-6" type="password" size="20" /></label><br />
<input type="submit" name="Submit" value="Invia" /></p></form>
]]></content:encoded>
			<wfw:commentRss>http://blog.tatablack.net/2008/04/30/vodafone-190-utils/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Incipit</title>
		<link>http://blog.tatablack.net/2008/04/30/incipit/</link>
		<comments>http://blog.tatablack.net/2008/04/30/incipit/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 23:14:53 +0000</pubDate>
		<dc:creator>TataBlack</dc:creator>
				<category><![CDATA[Annunci]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[incipit]]></category>

		<guid isPermaLink="false">http://blog.tatablack.net/?p=23</guid>
		<description><![CDATA[Da qualche parte bisogna pur cominciare. Fingerò dunque indifferenza verso la pagina bianca che mi guarda e inizierò con l&#8217;ammettere che, sì, evidentemente sto per entrare anch&#8217;io nel tunnel del blogging. A mia parziale discolpa posso anticipare che i temi di questo blog saranno prettamente tecnici, spaziando da frammenti di codice miei e altrui fino [...]]]></description>
			<content:encoded><![CDATA[<p><span lang="it">Da qualche parte bisogna pur cominciare. Fingerò dunque indifferenza verso la pagina bianca che mi guarda e inizierò con l&#8217;ammettere che, sì, evidentemente sto per entrare anch&#8217;io nel tunnel del blogging.</span></p>
<p><span lang="it">A mia parziale discolpa posso anticipare che i temi di questo blog saranno prettamente tecnici, spaziando da frammenti di codice miei e altrui fino a recensioni di software, il tutto inframmezzato da sproloqui che dall&#8217;informatica trarranno solo spunti.</span></p>
<p><span lang="it">D&#8217;accordo, d&#8217;accordo, la stessa cosa vale per centinaia di migliaia di altri blog &#8211; ma abbiate fede&#8230; <img src='http://blog.tatablack.net/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' /> </span></p>
<p><span lang="it">Per ora, poi, non credo di poter essere più preciso &#8211; e, a pensarci bene, anche potendo non lo farei: l&#8217;equilibrio tra la creazione di legittime aspettative e l&#8217;induzione di noia a non finire è, secondo me, fin troppo labile.</span></p>
<p><span lang="it">Ad ogni modo, giocherello con tastiere di computer da più di vent&#8217;anni (evidentemente mi piace) e i miei gusti e interessi, per forza di cose, vanno aggiornandosi insieme alla tecnologia, e sono condizionati dagli impatti sociali di questa.</span></p>
<p><span lang="it">Cosa voglio dire? Che neanch&#8217;io posso sapere dove andrò a parare&#8230; <img src='http://blog.tatablack.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  &#8230;ma, dal momento che la scoperta è parte integrante del divertimento, non posso che augurare <strong>buona esplorazione</strong> sia a me che a voi.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tatablack.net/2008/04/30/incipit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

