<?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>Marwan KHELIF &#187; XML</title>
	<atom:link href="http://www.mkhelif.fr/category/xml/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mkhelif.fr</link>
	<description>Le blog d&#039;un développeur</description>
	<lastBuildDate>Sun, 25 Jul 2010 21:30:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>HTML 5 : deux nouveaux documents</title>
		<link>http://www.mkhelif.fr/2009/02/18/html-5-deux-nouveaux-documents.html</link>
		<comments>http://www.mkhelif.fr/2009/02/18/html-5-deux-nouveaux-documents.html#comments</comments>
		<pubDate>Wed, 18 Feb 2009 13:57:34 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2009/02/18/html-5-deux-nouveaux-documents.html</guid>
		<description><![CDATA[Le W3C (World Wide Web Consortium, consortium chargé de promouvoir la compatibilité des technologies Web) vient de publier deux nouveaux documents traitant de la version 5 de HTML. La version 4 de HTML a été figée en 1997 et la version 5 est en développement depuis 2004.
L&#8217;un des documents présente la liste des différences entre [...]]]></description>
			<content:encoded><![CDATA[<p>Le <a href="http://www.w3.org/" target="_blank">W3C</a> (World Wide Web Consortium, consortium chargé de promouvoir la compatibilité des technologies Web) vient de publier deux nouveaux documents traitant de la version 5 de HTML. La version 4 de HTML a été figée en 1997 et la version 5 est en développement depuis 2004.</p>
<p>L&#8217;un des documents présente la liste des <a href="http://www.w3.org/TR/html5-diff/" target="_blank">différences entre HTML 4 et HTML 5</a> (liste évidement non exhaustive) :</p>
<ul>
<li>Le langage est basé sur l&#8217;utilisation des documents DOM.</li>
<li>Concept de contextes de navigation.</li>
<li>Nouveaux concepts de modèles de contenu (remplaçant les actuels <em>block</em> et <em>inline</em>).</li>
<li>Nouveaux éléments : <em>datagrid</em>, <em>menu</em> (pour l&#8217;utilisation en natif de menu contextuel), <em>commands</em>.</li>
<li>Gestion du cache pour les applications Web en mode déconnecté (concept de Google Gears?).</li>
<li>Concept de <em>UndoManager</em>, permettant de gérer l&#8217;undo/redo.</li>
<li>Architecture de copier/coller et drag&amp;drop.</li>
<li>Nouveaux éléments permettant d&#8217;embarquer du contenu vidéo, canvas (pour les graphes 2D, les jeux, &#8230;).</li>
<li>Nouveaux types d&#8217;élément <em>input</em> : date, number, email, url, color, &#8230;L&#8217;élément <em>input</em> a aussi droit à un nouvel attribut : <em>autofocus</em>, permettant de lui donner directement le focus lors du chargement de la page.</li>
<li>Suppression des éléménts <em>frame</em>, <em>frameset </em>et <em>noframe</em>, car ils dégradent l&#8217;utilisation et l&#8217;accessibilité du site.</li>
</ul>
<p>HTML 5 sera évidement compatible avec les pages en HTML 4. Cette nouvelle version a aussi pour but de standardiser toutes les API JavaScript grâce à un référentiel commun.</p>
<p>L&#8217;autre document est la <a href="http://www.w3.org/TR/html5/" target="_blank">spécification complète de HTML 5</a>.<br />
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/12/15/goo-gl-le-raccourcisseur-durl-by-google.html" title="Goo.gl : le raccourcisseur d&rsquo;URL by Google">Goo.gl : le raccourcisseur d&rsquo;URL by Google</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/10/20/guide-doptimisation-de-vos-applications-web.html" title="Guide d&rsquo;optimisation de vos applications Web">Guide d&rsquo;optimisation de vos applications Web</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/18/twitter-la-voip-disponible-grce-jajah.html" title="Twitter : la VoIP disponible gr&acirc;ce &agrave; Jajah">Twitter : la VoIP disponible gr&acirc;ce &agrave; Jajah</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/12/cinq-moyens-pour-grer-son-identit-virtuelle.html" title="Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle">Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html" title="Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby">Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2009/02/18/html-5-deux-nouveaux-documents.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java : Utilisation de Protocol Buffers</title>
		<link>http://www.mkhelif.fr/2008/07/29/java-utilisation-de-protocol-buffers.html</link>
		<comments>http://www.mkhelif.fr/2008/07/29/java-utilisation-de-protocol-buffers.html#comments</comments>
		<pubDate>Tue, 29 Jul 2008 09:34:21 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2008/07/29/java-utilisation-de-protocol-buffers.html</guid>
		<description><![CDATA[Voici un petit tutoriel sur l&#8217;utilisation du nouveau format de Google : Protocol Buffers en Java. Ce format se veut être le remplaçant de XML, standard actuel pour le stockage et l&#8217;échange de données au format texte.

Dans cet exemple nous allons créer un gestionnaire de contact. Ce billet est une traduction de la documentation de [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un petit tutoriel sur l&#8217;utilisation du <a href="http://www.mkhelif.fr/2008/07/10/google-lance-protocol-buffers.html">nouveau format de Google : Protocol Buffers</a> en Java. Ce format se veut être le remplaçant de XML, standard actuel pour le stockage et l&#8217;échange de données au format texte.<br />
<span id="more-86"></span><br />
Dans cet exemple nous allons créer un gestionnaire de contact. Ce billet est une traduction de la documentation de Google : <a href="http://code.google.com/apis/protocolbuffers/docs/javatutorial.html">Protocol Buffers Basics</a>.</p>
<h3>Fichier de définition</h3>
<p>Tout d&#8217;abord le fichier de définition <em>.proto</em> permettant de définir le format des données.</p>

<div class="wp_codebox"><table><tr id="p865"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p86code5"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">fr.mkhelif.pb</span><span style="color: #339933;">;</span>
&nbsp;
option java_package <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;fr.mkhelif.pb.demo&quot;</span><span style="color: #339933;">;</span>
option java_outer_classname <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;AddressBook&quot;</span><span style="color: #339933;">;</span>
&nbsp;
message Contact <span style="color: #009900;">&#123;</span>
  required string name <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  required int32 id <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
  optional string email <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">enum</span> PhoneType <span style="color: #009900;">&#123;</span>
    MOBILE <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    HOME <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    WORK <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  message PhoneNumber <span style="color: #009900;">&#123;</span>
    required string number <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    optional PhoneType type <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">=</span> HOME<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  repeated PhoneNumber phone <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
message AddressBook <span style="color: #009900;">&#123;</span>
  repeated Contact contact <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La déclaration d&#8217;un <strong>package</strong> permet comme en Java d&#8217;éviter les conflits de nom. Si vous déclarez un <strong>package</strong> (comme dans cet exemple) le package de la classe Java sera le même. Ici on surcharge le package java avec l&#8217;option <strong>java_package</strong>. On définie le nom de la classe Java grâce à l&#8217;option <strong>java_outer_classname</strong>. Si vous ne définissez pas de nom de classe le compileur utilisera le nom du fichier : <strong>adressbook.proto</strong> donnera <strong>AdressBook</strong>. Ensuite on définie un bean, appelé ici <strong>message</strong>, Personne avec des attributs <strong>name</strong>, <strong>id</strong>, <strong>email</strong> et <strong>phone</strong>. Comme dans les langages objets, un <strong>message</strong> (bean) est défini par des attributs. Ici une personne possède un nom (<strong>name</strong>), un identifiant (<strong>id</strong>), une adresse email et plusieurs numéros de téléphone (<strong>phone</strong>). Un attribut est soit un autre <strong>message</strong> soit un type simple : <em>string</em>, <em>int32</em>, <em>boolean</em>, <em>float</em> ou <em>double</em>. Vous pouvez aussi définir des énumérations permettant ainsi de limiter le nombre d&#8217;élément possibles (dans l&#8217;exemple précédent un numéro de téléphone possède un type qui ne peut être que : MOBILE, HOME ou WORK. Chaque champs doit être annoté d&#8217;un des modifieurs suivants :</p>
<ol>
<li><em>required</em> : le champs est obligatoire. Si il n&#8217;est pas initialisé l&#8217;objet est marqué comme <em>uninitialized</em>. Lors de la sérialisation d&#8217;un objet <em>uninitialized</em> une <strong>RuntimeException</strong> est levée. Lors de la déserialisation une <strong>IOException</strong> est levée.</li>
<li><em>optional</em> : le champs est optionnel et peut ne pas être initialisé. Un message avec un champs <em>optional</em> non initialisé utilisera une valeur par défaut : <em>0</em> pour les types numériques, <em>false</em> pour les <em>boolean</em>, une chaîne vide pour les <em>string</em> et pour les messages une instance par défaut avec tous les champs avec des valeurs par défaut. Vous pouvez spécifier une valeur par défaut pour un champs : [default = <em>&lt;value&gt;</em>] comme pour le type de numéro de téléphone.</li>
<li><em>repeated</em> : le champs peut être répétés 0 ou plusieurs fois. L&#8217;ordre des valeurs est respecté lors de la (dé)sérialisation. Un champs répété agit comme un tableau dynamique.</li>
</ol>
<p>Les marqueurs &laquo;&nbsp;=1&#8243;, &laquo;&nbsp;=2&#8243;, &#8230;permettent d&#8217;identifier le tag unique utilisé par ce champs lors de la sérialisation. Les marqueurs de 1 à 15 sont encodés sur un octet de moins que les marqueurs supérieurs à 16. Ainsi les marqueurs de 1 à 15 peuvent être utilisés par les champs souvent utilisés ou par les champs <em>repeated</em>.</p>
<h3>Compilation de votre ProtocolBuffers</h3>
<p>Pour compiler le fichier <strong>.proto</strong> en classes il suffit d&#8217;utiliser <a href="http://code.google.com/p/protobuf/downloads/list" target="_blank">le compilateur de ProtocolBuffers</a> : <em>protoc</em>.</p>
<p>En exécutant la commande suivante le compilateur va générer une classe AddressBookProtos.java avec des classes internes :</p>
<p>protoc AddressBook.proto &#8211;java_out=&lt;destination&gt;</p>
<p>Dans le répertoire <em>&lt;destination&gt;</em> il va y avoir l&#8217;arborescense : <em>&lt;destination&gt;</em>/fr/mkhelif/pb/AddressBookProtos.java</p>
<h3>Utilisation des classes</h3>
<h5>Création d&#8217;un objet</h5>
<p>Pour créer un object <strong>Contact</strong> il faut utiliser la classe : Contact.Builder qui permet d&#8217;instancier un objet valide.</p>

<div class="wp_codebox"><table><tr id="p866"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p86code6"><pre class="java" style="font-family:monospace;">Contact.<span style="color: #006633;">Builder</span> contact <span style="color: #339933;">=</span> Contact.<span style="color: #006633;">newBuilder</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
contact.<span style="color: #006633;">setName</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Marwan KHELIF&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
contact.<span style="color: #006633;">setEmail</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contact@mkhelif.fr&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
Contact.<span style="color: #006633;">PhoneNumber</span> phone <span style="color: #339933;">=</span> Contact.<span style="color: #006633;">PhoneNumber</span>.<span style="color: #006633;">newBuilder</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
phone.<span style="color: #006633;">setNumber</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;0123456789&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
phone.<span style="color: #006633;">setType</span> <span style="color: #009900;">&#40;</span>Contact.<span style="color: #006633;">PhoneType</span>.<span style="color: #006633;">HOME</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
contact.<span style="color: #006633;">addPhone</span> <span style="color: #009900;">&#40;</span>phone<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
contact.<span style="color: #006633;">build</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>L&#8217;utilisation de ProtocolBuffers permet de chaîner les appels de méthodes, ainsi l&#8217;exemple précédent peut être écris :</p>

<div class="wp_codebox"><table><tr id="p867"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p86code7"><pre class="java" style="font-family:monospace;">Contact.<span style="color: #006633;">Builder</span> contact <span style="color: #339933;">=</span> Contact.<span style="color: #006633;">newBuilder</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
contact.<span style="color: #006633;">setName</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Marwan KHELIF&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">setEmail</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contact@mkhelif.fr&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">addPhone</span> <span style="color: #009900;">&#40;</span>Contact.<span style="color: #006633;">PhoneNumber</span>.<span style="color: #006633;">newBuilder</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        .<span style="color: #006633;">setNumber</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;0123456789&quot;</span><span style="color: #009900;">&#41;</span>
        .<span style="color: #006633;">setType</span> <span style="color: #009900;">&#40;</span>Contact.<span style="color: #006633;">PhoneType</span>.<span style="color: #006633;">HOME</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">build</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h5>Sérialisation des objets</h5>
<p>Afin de sérialiser un objet il y à deux méthodes :</p>
<ol>
<li>Récupérer directement un tableau d&#8217;octets : <em>toByteArray ()</em>.</li>
<li>Sérialiser directement dans un flux : <em>writeTo (OutputStream)</em>.</li>
</ol>
<p>De même pour la déserialisation :</p>
<ol>
<li>Depuis un tableau d&#8217;octets : <em>parseFrom (byte[])</em>.</li>
<li>Depuis un flux : <em>parseFrom (InputStream)</em>.</li>
</ol>
<h5>Amélioration</h5>
<p>Par défaut le compilateur de ProtocolBuffers génère des fichiers le plus petits possible. Si dans votre applications vous avez des problèmes de performances dues aux classes générées, vous pouvez ajouter l&#8217;option :</p>

<div class="wp_codebox"><table><tr id="p868"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p86code8"><pre class="java" style="font-family:monospace;">option optimize_for <span style="color: #339933;">=</span> SPEED<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Cette option permet de compiler des fichiers plus gros mais à l&#8217;exécution le code sera optimizé pour votre ProtocolBuffer.</p>
<h3>Conclusion</h3>
<p>Ce nouveau format est très prometteur car la définition des fichiers <strong>proto</strong> est beaucoup plus orientée objet que XML. Cependant il reste encore des points à améliorer.<br />
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html" title="Première utilisation du plugin Eclipse GWT">Première utilisation du plugin Eclipse GWT</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/07/10/google-lance-protocol-buffers.html" title="Google lance Protocol Buffers">Google lance Protocol Buffers</a></li>
<li><a href="http://www.mkhelif.fr/2009/12/15/goo-gl-le-raccourcisseur-durl-by-google.html" title="Goo.gl : le raccourcisseur d&rsquo;URL by Google">Goo.gl : le raccourcisseur d&rsquo;URL by Google</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/12/cinq-moyens-pour-grer-son-identit-virtuelle.html" title="Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle">Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/07/29/java-utilisation-de-protocol-buffers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google lance Protocol Buffers</title>
		<link>http://www.mkhelif.fr/2008/07/10/google-lance-protocol-buffers.html</link>
		<comments>http://www.mkhelif.fr/2008/07/10/google-lance-protocol-buffers.html#comments</comments>
		<pubDate>Thu, 10 Jul 2008 16:17:57 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2008/07/10/google-lance-protocol-buffers.html</guid>
		<description><![CDATA[Vous pensiez que XML était un standard, Google veut changer la donne avec un nouveau format : Protocol Buffers.
Google annonce ce nouveau format : &#171;&#160;Pensez à XML mais en plus petit, plus rapide et plus simple&#160;&#187;. Ce format est utilisé depuis longtemps par Google dans ses applications. Le principe de ce format ressemble à une [...]]]></description>
			<content:encoded><![CDATA[<p>Vous pensiez que XML était un standard, Google veut changer la donne avec un nouveau format : <a href="http://code.google.com/apis/protocolbuffers/" target="_blank">Protocol Buffers</a>.</p>
<p>Google annonce ce nouveau format : &laquo;&nbsp;Pensez à XML mais en plus petit, plus rapide et plus simple&nbsp;&raquo;. Ce format est utilisé depuis longtemps par Google dans ses applications. Le principe de ce format ressemble à une sérialisation des données : on définie la structure des données, on compile pour obtenir du code source permettant de lire et écrire.</p>
<p>Actuellement ce format est développé uniquement en C++, <a title="Java : Utilisation de ProtocolBuffers." href="http://www.mkhelif.fr/2008/07/29/java-utilisation-de-protocol-buffers.html" target="_self">Java</a> et Python. Le langage Perl est déjà prévu mais rien pour PHP, Ruby, DotNet.</p>
<p>Ce nouveau format ne changera pour l&#8217;instant pas le standard qu&#8217;est XML. Mais si ce dernier n&#8217;évolue pas, surtout au niveau de la rapidité, il se pourrait bien que Protocol Buffers prenne sa place.</p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html" title="Première utilisation du plugin Eclipse GWT">Première utilisation du plugin Eclipse GWT</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/07/29/java-utilisation-de-protocol-buffers.html" title="Java : Utilisation de Protocol Buffers">Java : Utilisation de Protocol Buffers</a></li>
<li><a href="http://www.mkhelif.fr/2009/12/15/goo-gl-le-raccourcisseur-durl-by-google.html" title="Goo.gl : le raccourcisseur d&rsquo;URL by Google">Goo.gl : le raccourcisseur d&rsquo;URL by Google</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/12/cinq-moyens-pour-grer-son-identit-virtuelle.html" title="Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle">Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/07/10/google-lance-protocol-buffers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validation XML</title>
		<link>http://www.mkhelif.fr/2008/01/03/validation-xml.html</link>
		<comments>http://www.mkhelif.fr/2008/01/03/validation-xml.html#comments</comments>
		<pubDate>Thu, 03 Jan 2008 10:21:52 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://wiki.mkhelif.fr/beta/2008/01/03/validation-xml.html</guid>
		<description><![CDATA[Lors de l&#8217;utilisation du langage XML on voudrait que tous les documents que l&#8217;on va parser soit valide, c&#8217;est à dire qu&#8217;ils correspondent à un certain format. Cependant si l&#8217;utilisateur a accés à ces documents XML il faut pouvoir vérifier que le document est valide.
On peut réaliser cette vérification pendant le parsing mais cela ajoute [...]]]></description>
			<content:encoded><![CDATA[<p>Lors de l&#8217;utilisation du langage XML on voudrait que tous les documents que l&#8217;on va parser soit valide, c&#8217;est à dire qu&#8217;ils correspondent à un certain format. Cependant si l&#8217;utilisateur a accés à ces documents XML il faut pouvoir vérifier que le document est valide.<br />
On peut réaliser cette vérification pendant le parsing mais cela ajoute une tâche au développeur.</p>
<p>C&#8217;est pour cela qu&#8217;il existe des langages de validations, ils permettent de valider le format des documents XML selon un format qui est défini par le dévéloppeur.</p>
<p>La plupart des parseurs vérifient le format et renvoient une erreur si le format n&#8217;est pas respecté.</p>
<p><span id="more-31"></span></p>
<h2>Les langages de validations</h2>
<p>Il existe plusieurs langages de validations, mais je ne vais vous présenter que les deux les plus utilisés.</p>
<p>Les différents langages :</p>
<ul>
<li>DTD (<strong>D</strong>ocument <strong>T</strong>ype <strong>D</strong>efinition) : définition du type de document. Ce langage peut être inclu directement dans le document XML.</li>
<li>XML Schema : il permet de définir la structure d&#8217;un document avec plus de précision (type de donnée, nombre d&#8217;occurence, &#8230;).</li>
<li>Relax NG (<strong>RE</strong>gular <strong>LA</strong>nguage for <strong>X</strong>ML <strong>N</strong>ext <strong>G</strong>eneration) : ce langage ne spécifie que la structure du document, le type de donnée est sous-traitée à la bibliothèque de types de XML Schema.</li>
<li>Schematron : contrairement aux autres langages Schematron définie un modèle d&#8217;arbre du document XML, il utilise la même conception que XPath ou XSLT.</li>
</ul>
<h2>Doctype</h2>
<p>Une DTD est une grammaire permettant de vérifier la validité d&#8217;un document.<br />
Un document XML peut avoir une DTD incluse dans son entête ou bien indiquée le fichier où elle se situe.</p>
<p>Une DTD définit trois objets permettant de définir la grammaire :</p>
<ul>
<li> ELEMENT : représente un élément XML et permet de définir les sous-éléments ansi que leurs occurences.</li>
<li>ATTLIST : liste des attributs d&#8217;un élément.</li>
<li>ENTITY : permet de définir un &#8216;alias&#8217;.</li>
</ul>
<p>Une DTD est définie de la façon suivante :</p>
<pre>&lt;!DOCTYPE element-racine [
  &lt;!ELEMENT ...&gt;
  &lt;!ATTLIST ...&gt;
  &lt;!ENTITY ...&gt;
]&gt;</pre>
<p>Voici un site permettant de valider un fichier XML avec sa DTD : <a href="http://www.stg.brown.edu/service/xmlvalid/" title="Validateur XML" target="_blank">http://www.stg.brown.edu/service/xmlvalid/</a>.</p>
<h3>Élément</h3>
<p>Permet de définir un élément XML en spécifiant le nom les sous-éléments de ce dernier.<br />
La déclaration d&#8217;un ENTITY doit avoir la syntaxe suivante :</p>
<pre>&lt;!ELEMENT nom (Donnees)&gt;</pre>
<p>La définition des <strong>Donnees</strong> peut avoir les valeurs suivantes :</p>
<ul>
<li><strong>(#PCDATA)</strong> : l&#8217;élément contient des données de types textes mais ne peut pas contenir de sous-éléments.</li>
<li><strong>(Element1, Element2, &#8230;)</strong> : liste des sous-éléments que contient l&#8217;élément.</li>
<li><strong>(Element1 | Element2 | &#8230;)</strong> : liste des sous-éléments qui peuvent être contenus par cet élément.</li>
<li><strong>ANY</strong> : cet élément peut contenir n&#8217;importe quel type de données.</li>
<li><strong>EMPTY</strong> : cet élément doit être vide et ne peux contenir aucune donnée (texte ou éléments).</li>
</ul>
<p>Dans la définition des sous-éléments on peut spécifier l&#8217;occurence de l&#8217;élément :</p>
<ul>
<li><strong>Element1?</strong> : l&#8217;élément peut apparaître 0 ou 1 fois.</li>
<li><strong>Element1+</strong> : l&#8217;élément peut apparaître 1 ou plusieurs fois.</li>
<li><strong>Element1*</strong> : l&#8217;élément peut apparaître 0, 1 ou plusieurs fois.</li>
</ul>
<p>On peut spécifier le nombre de sous-élément en répétant l&#8217;élément enfant :</p>
<pre>&lt;!ELEMENT element1 (element2, element2)&gt;</pre>
<p>Ici l&#8217; &laquo;&nbsp;élément1&#8243; devra forcément contenir 2 éléments &laquo;&nbsp;element2&#8243;.</p>
<p>Voici un exemple de DTD d&#8217;une liste de contacts :</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?&gt;
&lt;!DOCTYPE contacts [
  &lt;!ELEMENT contacts (contact*)&gt;
  &lt;!ELEMENT contact (nom, adresse, mail)&gt;
  &lt;!ELEMENT nom (#PCDATA)&gt;
  &lt;!ELEMENT adresse (#PCDATA)&gt;
  &lt;!ELEMENT mail (#PCDATA)&gt;
]&gt;</pre>
<pre>&lt;contacts&gt;
  &lt;contact&gt;
    &lt;nom&gt;Marwan KHELIF&lt;/nom&gt;
      &lt;adresse&gt;...&lt;/adresse&gt;
      &lt;mail&gt;mkhelif@gmail.com&lt;/mail&gt;
    &lt;/contact&gt;
  &lt;contact&gt;
      &lt;nom&gt;My Name&lt;/nom&gt;
      &lt;adresse&gt;My address&lt;/adresse&gt;
      &lt;mail&gt;my.mail@mail.com&lt;/mail&gt;
    &lt;/contact&gt;
  &lt;/contacts&gt;
&lt;/code&gt;</pre>
<h3>Attlist</h3>
<p>La déclaration ATTLIST permet de définir les attributs d&#8217;un élément. On peut spécifier le type de donnée, la valeur par défaut, forcer la présence de l&#8217;élément, &#8230;</p>
<p>La déclaration se fait ainsi :</p>
<pre>&lt;!ATTLIST nomElement nomAttribut Type ValeurDefaut&gt;</pre>
<p>Le nom de l&#8217;élément doit correspondre au nom d&#8217;un élément déclaré dans la DTD.</p>
<p>Le type de l&#8217;attribut peut prendre les valeurs suivantes :</p>
<ul>
<li><strong>CDATA</strong> : l&#8217;attribut contient des données textuelles.</li>
<li><strong>ID</strong> : chaqu&#8217;un des éléments définis doit avoir une valeur différente pour cet attribut.</li>
<li><strong>IDREF </strong>: référence la valeur d&#8217;un attribut <strong>ID</strong> d&#8217;un autre élémént.</li>
<li><strong>IDREFS </strong>: liste d&#8217;attributs <strong>ID</strong>, ses valeurs sont séparées par un espace.</li>
<li><strong>ENTITY </strong>: correspond à une ENTITY déclarée dans la DTD.</li>
<li><strong>ENTITIES </strong>: listes d&#8217;ENTITY déclarées dans la DTD, chaque ENTITY doit être séparées par un espace.</li>
<li><strong>NMTOKEN </strong>: la valeur doit être un nom XML valide.</li>
<li><strong>NMTOKENS </strong>: liste de noms XML valides.</li>
<li><strong>NOTATION</strong> : nom d&#8217;une notation définie dans la DTD.</li>
</ul>
<p>La valeur par défaut de l&#8217;attribut peut prendre les valeurs suivantes :</p>
<ul>
<li><strong><em>valeur</em></strong> : valeur par défaut de l&#8217;attribut.</li>
<li><strong>#REQUIRED</strong> : l&#8217;élément doit forcément posséder cet attribut.</li>
<li><strong>#IMPLIED</strong> : cet attribut n&#8217;est pas obligatoire.</li>
<li><strong>#FIXED <em>valeur</em></strong> : l&#8217;attribut doit forcément avoir la valeur <em>valeur</em>.</li>
</ul>
<p>Voilà un exemple de DTD définissant des attributs :</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?&gt;
 &lt;!DOCTYPE personnes [
  &lt;!ELEMENT personnes (personne*)&gt;
  &lt;!ELEMENT personne (adresse, mail)&gt;
  &lt;!ATTLIST personne
       id ID #REQUIRED
       nom CDATA #REQUIRED
       sexe (homme | femme) "homme"&gt;</pre>
<pre>  &lt;!ELEMENT adresse (#PCDATA)&gt;
  &lt;!ATTLIST adresse
       code CDATA #REQUIRED&gt;</pre>
<pre>  &lt;!ELEMENT mail (#PCDATA)&gt; ]&gt;</pre>
<pre>&lt;personnes&gt;
  &lt;personne id="user0" nom="Marwan KHELIF"&gt;
    &lt;adresse code="13"&gt;...&lt;/adresse&gt;
    &lt;mail&gt;mkhelif@gmail.com&lt;/mail&gt;
  &lt;/personne&gt;
  &lt;personne id="user1" nom="MyName" sexe="femme"&gt;
    &lt;adresse code="01"&gt;...&lt;/adresse&gt;
    &lt;mail&gt;monMail@mail.com&lt;/mail&gt;
  &lt;/personne&gt;
&lt;/personnes&gt;</pre>
<h3>Entity</h3>
<p>La déclaration d&#8217;une ENTITY permet de créer un &#8216;alias&#8217;, elle est ensuite utilisable dans le document XML.</p>
<p>On la déclare de la façon suivante :</p>
<pre>&lt;!ENTITY nomEntity "valeur"&gt;</pre>
<p>On peut alors l&#8217;utiliser dans le document XML : <em>&amp;nomEntity;</em>, la valeur définie sera alors positionnée à la place de cet entité.</p>
<p>Par exemple :</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?&gt;</pre>
<pre>&lt;!DOCTYPE articles [   &lt;!ENTITY auteur "Marwan KHELIF"&gt;
  &lt;!ENTITY dtd "Document Type Definition"&gt;
  &lt;!ENTITY xsd "XML Schema"&gt;</pre>
<pre>  &lt;!ELEMENT articles (article*)&gt;</pre>
<pre>  &lt;!ELEMENT article (#PCDATA)&gt;
  &lt;!ATTLIST article
       titre CDATA #REQUIRED
       auteur CDATA "&amp;auteur;"
       date CDATA #REQUIRED&gt;
]&gt;</pre>
<pre>&lt;articles&gt;
  &lt;article titre="&amp;dtd;" date="17/07/07"&gt;Presentation de &amp;dtd; par &amp;auteur;.&lt;/article&gt;
  &lt;article titre="&amp;xsd;" date="17/07/07"&gt;Presentation de &amp;xsd; par &amp;auteur;.&lt;/article&gt;
&lt;/articles&gt;</pre>
<p>Ce sont les entités générales du document, il y a un autre type d&#8217;entités : les entités paramètes.<br />
Elles sont définies de la même manière sauf qu&#8217;il faut rajouter un &#8216;<em>%</em>&#8216; devant le nom :</p>
<pre>&lt;!ENTITY % nomEntity "valeur"&gt;</pre>
<p>On les utilise de la façon suivante : <em>%nomEntity;</em>.<br />
Voilà un exemple de leur utilisation :</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?&gt;
&lt;!DOCTYPE articles [
  &lt;!ENTITY % article "titre, auteur, date, contenu"&gt;</pre>
<pre>  &lt;!ENTITY auteur "Marwan KHELIF"&gt;
  &lt;!ENTITY dtd "Document Type Definition"&gt;
  &lt;!ENTITY xsd "XML Schema"&gt;</pre>
<pre>  &lt;!ELEMENT articles (article*)&gt;
  &lt;!ELEMENT article (%article;)&gt;
  &lt;!ELEMENT titre (#PCDATA)&gt;
  &lt;!ELEMENT auteur (#PCDATA)&gt;
  &lt;!ELEMENT date (#PCDATA)&gt;
  &lt;!ELEMENT contenu (#PCDATA)&gt;
]&gt;</pre>
<pre>&lt;articles&gt;
  &lt;article&gt;
    &lt;titre&gt;&amp;dtd;&lt;/titre&gt;
    &lt;auteur&gt;&amp;auteur;&lt;/auteur&gt;
    &lt;date&gt;17/07/07&lt;/date&gt;
    &lt;contenu&gt;Presentation de &amp;dtd; par &amp;auteur;.&lt;/contenu&gt;
  &lt;/article&gt;
  &lt;article&gt;
    &lt;titre&gt;&amp;xsd;&lt;/titre&gt;
    &lt;auteur&gt;&amp;auteur;&lt;/auteur&gt;
    &lt;date&gt;17/07/07&lt;/date&gt;
    &lt;contenu&gt;Presentation de &amp;xsd; par &amp;auteur;.&lt;/contenu&gt;
  &lt;/article&gt;
&lt;/articles&gt;</pre>
<p>Ces deux types d&#8217;entités sont internes au document XML, on peut indiquer que la cible de l&#8217;entité est un fichier externe au document :</p>
<pre>&lt;!ENTITY doc SYSTEM "http//www.mkhelif.fr/doc.xml"&gt;
&amp;doc;
&lt;!ENTITY % articles SYSTEM "articles.dtd"&gt;
%articles;</pre>
<p>Lors de l&#8217;utilisation de l&#8217;entité le contenu du fichier sera chargé et remplacera l&#8217;entité.</p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2009/02/18/html-5-deux-nouveaux-documents.html" title="HTML 5 : deux nouveaux documents">HTML 5 : deux nouveaux documents</a></li>
<li><a href="http://www.mkhelif.fr/2008/03/17/nouveautes-java-7-dolphin.html" title="Nouveautés Java 7 &#8211; Dolphin">Nouveautés Java 7 &#8211; Dolphin</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/01/03/validation-xml.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
