Manipuler XML avec Scala : Différentes approches

 

Scala      xmlindex          Scala

L'objectif est de présenter clairement les différentes façons de manipuler XML avec Scala.

L'API Scala va très loin dans la gestion (ou "processing") XML. Scala traite du XML avec respect. Nous verrons plus loin cela en détail.

L'API Scala rend facile voire fun la gestion XML mais l'API est tellement riche qu'elle peut donner le vertige lors de sa première utilisation.

Dans ce billet, nous détaillons ces points:

  • Déclarer nativement xml dans Scala,
  • Rechercher via des requêtes  XPATH,
  • Charger xml depuis un fichier,
  • Enregistrer le xml dans un fichier

Dans le prochain article, je détaille ces points:

  • Manipuler programmatiquement les scala.xml.Elem, scala.xml.Node
  • Convertir NodeSeq to Seq[Node] et inversement,
  • Rechercher les attributs dans xml,
  • Consommer un web service avec l'API scala.xml

Première partie

Commençons, comme le font les autres langages, par un exemple basique.

La classe (object) de scala ci-après déclare une chaîne xml:
scala: code 1.1, inutile?
On déclare sXml comme une String. Mais ce premier exemple n'a en réalité aucun intérêt.

Question 1.1: Pourquoi?

Scala traite avec respect le XML, c'est à dire que l'on peut déclarer le xml comme une classe comme suit:
scala: code 1.2, utile
La sortie de ce programme réalisée à l'aide de scala.xml.PrettyPrinter:

<books>
   <book>
      <author>Victor Hugo</author>
   </book>
</books>
sortie 1

Les points importants à retenir de l'exemple 2:

  • Dans l'exemple 2, la déclaration xml n'est pas une String
  • Dans Scala, le xml est considéré tel qu'il est. C'est du xml brut, passé à la variable Scala.

Pour les curieux, le type de la variable xml est scala.xml.Elem. Nous y reviendrons plus loin.

Aussi on peut compléter le code afin d'afficher la liste des labels et des text via xml.label et xml.text.

Le plus  important c'est la possibilité de mixer du xml brut avec les variables Scala comme illustré ci-dessous:

scala: code 1.3, très utile

Voici la sortie de ce programme:
sortie 1

Seconde partie : Requêtes XML avec XPath

Question 2.1. Comment manipuler ces déclarations xml brutes dans Scala?

Scala rend facile la manipulation du xml. Pour le prouver, commençons par un exemple simple:

scala: code 2.1

Question 2.2: Que fait l'opérateur \\  ?

L'emploi de \\ et \ opérateurs sont analogues aux expressions XPath // et /.

La méthode \\ renvoie tous les éléments correspondants au critère à partir de tous les nœuds en dessous du nœud courant et de ses descendants.

Par exemple, la sortie de l'exemple 3:

sortie=<author>Victor Hugo</author>
sortie 2

Question 2.3: Quelle est la différence entre \\ et \ ?

L'emploi de \\ et \ opérateurs sont analogues aux expressions XPath // et /.

La méthode \\ renvoie tous les éléments correspondants au critère à partir de tous les nœuds en dessous du nœud courant et de ses descendants.

La méthode \ retourne seulement l'élément directement en dessous du nœud courant.

Par comparaison, la recherche xml \ "author" dans l'exemple 4 ne retourne rien:

     val authors=xml \ &quot;author&quot;
     println("authors="+authors)  // return authors=
scala: code 2.2

Troisième partie : Charger xml depuis un fichier

La méthode statique XML.loadFile permet de charger le contenu xml depuis un fichier.

Le code scala suivant fournit un exemple :

 val contenuXml:Elem= XML.loadFile("/tmp/book.xml" )
 println(new PrettyPrinter(50,3).format(contenuXml))
scala: code 3.1

La sortie xml de ce code sous réserve de créer un fichier nommé book.xml dans  /tmp :

<books>
   <book>
      <auteur>(...)</auteur>
      <auteur>(...)</auteur>
      <auteur nomFamille="Hugo" prénom="Victor">
         <naissance>
            <date>1802</date>
            (...)
         </naissance>
         <décès>
            <date>1885</date>
            (...)
         </décès>
         <biographie>(...)</biographie>
      </auteur>
   </book>
</books>
sortie 3

 

Quatrième partie : Écrire xml dans un fichier

La méthode save de l'api scala.xml.XML permet de sauvegarder le contenu des nœuds xml dans un fichier:

La méthode statique la plus simple est  XML.save(nom_file:String,elem:Elem).

Nous préférons plutôt la méthode XML.save(nom_file:String, node:Node,encoding:String, xmlDecl: Boolean= false, doctype: Doctype= null) comme illustré ci-dessous:

val xml=
 <books><book><author>Victor Hugo</author></book></books>
 XML.save("/tmp/savedBook.xml",xml.head,/*encoding*/"utf-8", true, null)
scala: code 4.1

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.