CodeGym /Blog Java /Random-FR /XML en Java
Auteur
John Selawsky
Senior Java Developer and Tutor at LearningTree

XML en Java

Publié dans le groupe Random-FR
Salut! Aujourd'hui, nous allons introduire un autre format de données appelé XML. C'est un sujet très important. Lorsque vous travaillez sur de vraies applications Java, vous rencontrerez presque certainement des tâches liées à XML. Dans le développement Java, ce format est utilisé presque universellement (nous verrons pourquoi ci-dessous), donc je vous recommande de ne pas revoir superficiellement cette leçon, mais plutôt d'acquérir une compréhension approfondie de tout et d'étudier également la littérature/les liens supplémentaires :) Ceci ne sera certainement pas une perte de temps. Alors, commençons par les choses faciles : le "quoi" et le "pourquoi" !

Qu'est-ce que JavaXML ?

XML signifie eXtensible Markup Language. Vous connaissez peut-être déjà un langage de balisage — avez-vous entendu parler du HTML, qui est utilisé pour créer des pages Web :) Qu'est-ce que XML ?  - 1HTML et XML ont même une apparence similaire :
HTML1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
En d'autres termes, XML est un langage de description de données.

Pourquoi avez-vous besoin de XML ?

XML a été inventé à l'origine pour stocker et envoyer plus facilement des données, y compris via Internet. Il présente plusieurs avantages qui vous aident à y parvenir. Tout d'abord, il est facile à lire à la fois par un humain et un ordinateur. Je pense que vous pouvez facilement comprendre ce que ce fichier XML décrit :

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Un ordinateur comprend également facilement ce format. Deuxièmement, puisque les données sont stockées sous forme de texte brut, il n'y aura aucun problème de compatibilité lorsque nous les transférerons d'un ordinateur à un autre. Il est important de comprendre que XML n'est pas du code exécutable — c'est un langage de description de données. Après avoir décrit les données à l'aide de XML, vous devez écrire du code (par exemple, en Java) qui peut envoyer/recevoir/traiter ces données.

Comment XML est-il structuré ?

Le composant principal est les balises : ce sont les choses entre crochets :

<book>
</book>
Il existe des balises ouvrantes et des balises fermantes. La balise fermante a un symbole supplémentaire (" / "), comme on peut le voir dans l'exemple ci-dessus. Chaque balise ouvrante doit avoir une balise fermante. Ils indiquent où commence et se termine la description de chaque élément du fichier. Les balises peuvent être imbriquées ! Dans notre exemple de livre, la balise <book> a 3 balises imbriquées : <title>, <author> et <year>. Cela ne se limite pas à un seul niveau d'imbrication : les balises imbriquées peuvent avoir leurs propres balises imbriquées, etc. Cette structure s'appelle une arborescence de balises. Examinons cet arbre à l'aide d'un exemple de fichier XML décrivant un concessionnaire automobile :

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Ici, nous avons une balise de niveau supérieur : <carstore>. Il est aussi appelé élément racine. <carstore> a une balise enfant : <car>. <car>, à son tour, a également 3 balises enfants : <model>, <year> et <price>. Chaque balise peut avoir des attributs, qui contiennent des informations supplémentaires importantes. Dans notre exemple, la balise <model> a un attribut "lang", qui indique la langue utilisée pour enregistrer le nom du modèle :

<model lang="en">Scania R 770</model>
Ici, nous indiquons que le nom est écrit en anglais. Notre balise <price> a un attribut "currency".

<price currency="US dollar">150000.00</price>
Ici, nous indiquons que le prix de la voiture est indiqué en dollars américains. Ainsi, XML a une syntaxe "auto-descriptive". Vous pouvez ajouter toute information dont vous avez besoin pour décrire les données. De plus, en haut du fichier, vous pouvez ajouter une ligne indiquant la version XML et l'encodage utilisé pour écrire les données. C'est ce qu'on appelle le "prologue" et il ressemble à ceci :

<?xml version="1.0" encoding="UTF-8"?>
Nous utilisons XML version 1.0 et l'encodage UTF-8. Ce n'est pas nécessaire, mais cela peut être utile si, par exemple, votre fichier utilise du texte dans différentes langues. Nous avons mentionné que XML signifie « eXtensible Markup Language », mais que signifie « extensible » ? Cela signifie qu'il est parfait pour créer de nouvelles versions de vos objets et fichiers. Par exemple, supposons que nous voulions également commencer à vendre des motos chez notre concessionnaire automobile ! Cela dit, nous avons besoin que notre programme prenne en charge les deux versions de <carstore> : l'ancienne (sans les motos) et la nouvelle. Voici notre ancienne version :

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Et voici le nouveau étendu:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
C'est aussi simple et facile d'ajouter une description des motos à notre fichier :) De plus, nous n'avons absolument pas besoin d'avoir les mêmes tags enfants pour les motos que pour les voitures. Veuillez noter que les motos, contrairement aux voitures, ont un élément <owner>. Cela n'empêche pas l'ordinateur (ou l'humain) de lire les données.

Différences entre XML et HTML

Nous avons déjà dit que XML et HTML sont très similaires en apparence. Il est donc très important de savoir en quoi ils diffèrent. Premièrement, ils sont utilisés à des fins différentes. HTML sert à baliser les pages Web. Par exemple, lors de la création d'un site Web, vous pouvez spécifier en HTML : "Le menu doit être dans le coin supérieur droit. Il doit avoir tel ou tel bouton". En d'autres termes, le travail de HTML est d'afficher des données. XML permet de stocker et d'envoyer des informations sous une forme pratique pour les humains et les ordinateurs. Ce format ne contient aucune indication sur la façon dont ces données doivent être affichées : cela dépend du code du programme qui les lit. Deuxièmement, il y a une différence technique majeure. Les balises HTML sont prédéfinies. En d'autres termes, la création d'un en-tête HTML (par exemple, une grande légende en haut de la page) utilise uniquement <h1></h1> balises (<h2></h2> et <h3></h3> sont utilisées pour les en-têtes plus petits). Vous ne pouvez pas créer d'en-têtes HTML à l'aide d'autres balises. XML n'utilise pas de balises prédéfinies. Vous pouvez donner aux balises le nom de votre choix : <header>, <title>, <idontknow2121>.

Résolution de conflit

La liberté offerte par XML peut entraîner certains problèmes. Par exemple, une même entité (par exemple, une voiture) peut être utilisée par un programme à des fins différentes. Par exemple, nous avons un fichier XML qui décrit les voitures. Cependant, nos programmeurs ne sont pas parvenus à un accord préalable entre eux. Et maintenant, en plus des données sur les vraies voitures, nous pourrions trouver des données sur les petites voitures dans notre XML ! De plus, ils ont les mêmes attributs. Disons que notre programme lit dans un tel fichier XML. Comment distinguer une vraie voiture d'une petite voiture ?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
Ici, les préfixes et l'espace de noms nous aideront. Afin de distinguer les petites voitures des vraies dans notre programme (et en fait tous les jouets de leurs vrais homologues), nous introduisons deux préfixes : "réel" et "jouet".

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
Maintenant, notre programme sera capable de faire la distinction entre les différentes entités ! Tout ce qui a le préfixe jouet sera traité comme un jouet :) Cependant, nous n'avons pas encore fini. Pour utiliser des préfixes, nous devons enregistrer chacun d'eux en tant qu'espace de noms. En fait, "s'inscrire" est un mot fort :) Nous devons simplement trouver un nom unique pour chacun d'eux. C'est comme pour les classes : une classe a un nom court ( Cat ) et un nom complet qui inclut tous les packages ( zoo.animals.Cat). Un URI est généralement utilisé pour créer un nom d'espace de noms unique. Parfois, cela se fait à l'aide d'une adresse Internet, où les fonctions de cet espace de noms sont décrites. Mais il n'est pas nécessaire que ce soit une adresse Internet valide. Très souvent, les projets utilisent simplement des chaînes de type URI qui aident à suivre la hiérarchie de l'espace de noms. Voici un exemple:

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
Bien sûr, il n'y a pas de site Web à "http://testproject.developersgroup1.companyname/department2/namespaces/real" Mais cette chaîne contient des informations utiles : les développeurs du groupe 1 du département 2 sont responsables de la création du "vrai" espace de noms . Si nous devons introduire de nouveaux noms ou discuter d'éventuels conflits, nous saurons à qui nous adresser. Parfois, les développeurs utilisent une véritable adresse Web descriptive comme nom d'espace de noms unique. Par exemple, cela peut être le cas pour une grande entreprise dont le projet sera utilisé par des millions de personnes à travers le monde. Mais ce n'est certainement pas toujours fait : Stack Overflow a une discussion sur ce problème. En général, il n'y a pas d'obligation stricte d'utiliser des URI comme noms d'espace de noms : vous pouvez aussi simplement utiliser des chaînes aléatoires. Cette option fonctionnerait également :

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Cela dit, l'utilisation d'un URI présente plusieurs avantages. Vous pouvez en savoir plus à ce sujet ici .

Normes XML de base

Les normes XML sont un ensemble d'extensions qui ajoutent des fonctionnalités supplémentaires aux fichiers XML. XML a beaucoup de standards, mais nous allons juste regarder les plus importants et découvrir qu'ils rendent AJAX possible, qui est l'un des standards XML les plus connus. Il permet de modifier le contenu d'une page web sans la recharger ! XSLT vous permet de convertir du texte XML dans d'autres formats. Par exemple, vous pouvez utiliser XSLT pour convertir XML en HTML ! Comme nous l'avons dit, le but de XML est de décrire des données, pas de les afficher. Mais avec XSLT nous pouvons contourner cette limitation ! XML DOM vous permet de récupérer, modifier, ajouter ou supprimer des éléments individuels d'un fichier XML. Voici un petit exemple de comment cela fonctionne. Nous avons un fichier books.xml :

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
Il a deux livres. Les livres ont un élément <title>. Ici, nous pouvons utiliser JavaScript pour obtenir tous les titres de livres de notre fichier XML et imprimer le premier sur la console :

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
La DTD ("document type definition") permet de définir une liste d'éléments autorisés pour une entité dans un fichier XML. Par exemple, supposons que nous travaillions sur le site Web d'une librairie et que toutes les équipes de développement conviennent que seuls les attributs titre, auteur et année doivent être spécifiés pour les éléments livre dans les fichiers XML. Mais comment se protéger de l'insouciance ? Très facile!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
Ici, nous avons défini une liste d'attributs valides pour <book>. Essayez d'y ajouter un nouvel élément et vous obtiendrez immédiatement une erreur !

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Erreur! "L'élément mainhero n'est pas autorisé ici" Il existe de nombreuses autres normes XML. Vous pouvez vous familiariser avec chacun d'eux et essayer d'approfondir le code. Quoi qu'il en soit, si vous avez besoin d'informations sur XML, vous y trouverez presque tout :) Et avec cela, notre leçon touche à sa fin. Il est temps de se remettre aux tâches ! :) Jusqu'à la prochaine fois!
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION