Comment lire et écrire des fichiers XML avec du code

Comment lire et écrire des fichiers XML avec du code / La programmation

Voulez-vous apprendre à lire et à écrire un fichier XML à partir de Java?

Les fichiers XML sont utilisés à diverses fins, y compris le stockage de données. Avant que JSON ne devienne populaire, XML était le format préféré pour représenter, stocker et transporter des données structurées. Même si la popularité de XML a diminué ces dernières années, il est possible que vous l'ayez rencontré occasionnellement. Il est donc important d'apprendre à utiliser ce code à partir de code..

Java Standard Edition (SE) 10 Concepts de base de Java à apprendre lors de la mise en route 10 Concepts de base de Java à apprendre lors de la mise en route Que vous écriviez une interface utilisateur graphique, développiez un logiciel côté serveur ou une application mobile utilisant Android, l'apprentissage de Java servira vous bien. Voici quelques concepts Java de base pour vous aider à démarrer. Lire la suite comprend le API Java pour le traitement XML (JAXP), qui est un terme générique couvrant la plupart des aspects du traitement XML. Ceux-ci inclus:

  • DOM: Le modèle d'objet de document inclut des classes permettant d'utiliser des artefacts XML tels qu'un élément, un nœud, des attributs, etc. L'API DOM charge le document XML complet en mémoire pour le traitement; il n'est donc pas très adapté au travail avec des fichiers XML volumineux..
  • SAXO: L'API simple pour XML est un algorithme de lecture de code XML piloté par les événements. Ici, XML est traité par les événements de déclenchement trouvés lors de la lecture de XML. La mémoire requise pour utiliser cette méthode est faible, mais l'utilisation de l'API est plus complexe que celle du DOM..
  • StAX: Streaming API for XML est une addition récente aux API XML et fournit un filtrage, un traitement et une modification de flux hautes performances pour XML. Bien que cela évite de charger tout le document XML en mémoire, il fournit une architecture de type extraction plutôt qu'une architecture pilotée par les événements, de sorte que l'application est plus facile à coder et à comprendre que d'utiliser l'API SAX..

Dans cet article, nous utilisons le API DOM montrer comment lire et écrire des fichiers XML à partir de java. Nous couvrirons les deux autres API dans de futurs articles.

Un exemple de fichier XML

Pour les besoins de cet article, nous présentons les concepts à l'aide de l'exemple XML suivant, que vous pouvez trouver ici:

   Gambardella, Matthew Guide du développeur XML Ordinateur 44.95 2000-10-01 Regard approfondi sur la création d'applications avec XML.   Ralls, Kim

Lecture d'un fichier XML

Voyons les étapes de base nécessaires à la lecture d'un fichier XML à l'aide de l'API DOM.

La première étape consiste à obtenir une instance de DocumentBuilder. Le générateur est utilisé pour analyser les documents XML. Pour une utilisation basique, nous le faisons comme ceci:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); Constructeur de DocumentBuilder = factory.newDocumentBuilder (); 

Nous pouvons maintenant charger tout le document en mémoire à partir de l’élément racine XML. Dans notre exemple, c’est le catalogue élément.

Fichier Fichier =…; // fichier XML à lire Document document = builder.parse (file); Catalogue d'éléments = document.getDocumentElement (); 

Et ça y est, les gars! L'API DOM pour lire un fichier XML est très simple. Vous avez maintenant accès à l'intégralité du document XML à partir de son élément racine, catalogue. Voyons maintenant comment travailler avec cela.

Utilisation de l'API DOM

Maintenant que nous avons la racine XML Élément, nous pouvons utiliser l'API DOM pour extraire des informations intéressantes.

Obtenez tous les livre enfants de l’élément racine et passez-les en boucle. Notez que getChildNodes () résultats tout enfants, y compris le texte, les commentaires, etc. Pour notre propos, nous avons uniquement besoin des éléments enfants, nous sautons donc les autres.

NodeList books = catalog.getChildNodes (); pour (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; // work with the book Element here  

Comment trouvez-vous un élément enfant spécifique, étant donné le parent? La méthode statique suivante renvoie le premier élément correspondant s'il est trouvé, ou null. Comme vous pouvez le constater, la procédure consiste à obtenir la liste des nœuds enfants et à les parcourir en les sélectionnant avec les nœuds d'élément portant le nom spécifié..

Nœud privé statique findFirstNamedElement (Node parent, String tagName) NodeList children = parent.getChildNodes (); pour (int i = 0, dans = children.getLength (); i < in ; i++)  Node child = children.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; if ( child.getNodeName().equals(tagName) ) return child;  return null;  

Notez que l’API DOM traite le contenu textuel d’un élément comme un nœud distinct de type. TEXT_NODE. En outre, le contenu du texte peut être divisé en plusieurs nœuds de texte adjacents. Donc, le traitement spécial suivant est requis pour récupérer le contenu du texte dans un élément.

static private String getCharacterData (parent de noeud) StringBuilder text = new StringBuilder (); if (parent == null) renvoie text.toString (); NodeList children = parent.getChildNodes (); pour (int k = 0, kn = children.getLength (); k < kn ; k++)  Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue());  return text.toString();  

Forts de ces fonctions pratiques, examinons maintenant un code permettant de répertorier certaines informations de notre exemple XML. Nous aimerions montrer des informations détaillées pour chaque livre, telles que celles disponibles dans un catalogue de livres..

NodeList books = catalog.getChildNodes (); pour (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; ii++; String id = book.getAttribute("id"); String author = getCharacterData(findFirstNamedElement(child,"author")); String title = getCharacterData(findFirstNamedElement(child,"title")); String genre = getCharacterData(findFirstNamedElement(child,"genre")); String price = getCharacterData(findFirstNamedElement(child,"price")); String pubdate = getCharacterData(findFirstNamedElement(child,"pubdate")); String descr = getCharacterData(findFirstNamedElement(child,"description")); System.out.printf("%3d. book id = %s\n" + " author: %s\n" + " title: %s\n" + " genre: %s\n" + " price: %s\n" + " pubdate: %s\n" + " descr: %s\n", ii, id, author, title, genre, price, pubdate, descr);  

Écrire une sortie XML

Java fournit les API XML Transform transformer des données XML. Nous utilisons cette API avec le transformation d'identité générer une sortie.

A titre d'exemple, ajoutons un nouveau livre élément du catalogue exemple présenté ci-dessus. Les détails du livre (tels que auteur, Titre, etc) peuvent être obtenus en externe, peut-être à partir d’un fichier de propriétés ou d’une base de données. Nous utilisons le fichier de propriétés suivant pour charger les données.

id = bk113 auteur = Jane Austen titre = orgueil et préjugés genre = prix romanesque = 6.99 publish_date = 2010-04-01 description = "C’est une vérité universellement reconnue, selon laquelle un seul homme en possession d’une bonne fortune doit manquer de une femme." C'est ainsi que commence Pride and Prejudice, la comédie spirituelle des moeurs de Jane Austen - l'un des romans les plus populaires de tous les temps - qui met en scène une bataille merveilleusement civilisée entre le fier M. Darcy et la préjugée Elizabeth Bennet Intrigues du salon du XVIIIe siècle. 

La première étape consiste à analyser le fichier XML existant en utilisant la méthode présentée ci-dessus. Le code est également indiqué ci-dessous.

Fichier Fichier =…; // fichier XML à lire Document document = builder.parse (file); Catalogue d'éléments = document.getDocumentElement (); 

Nous chargeons les données du fichier de propriétés en utilisant le Propriétés classe fournie avec java. Le code est assez simple et montré ci-dessous.

String propsFile =…; Propriétés props = new Properties (); try (FileReader in = new FileReader (propsFile)) props.load (in);  

Une fois les propriétés chargées, nous récupérons les valeurs que nous voulons ajouter à partir du fichier de propriétés..

String id = props.getProperty ("id"); String author = props.getProperty ("auteur"); String title = props.getProperty ("titre"); String genre = props.getProperty ("genre"); String price = props.getProperty ("price"); String publish_date = props.getProperty ("publish_date"); String descr = props.getProperty ("description"); 

Créons maintenant un vide livre élément.

Element book = document.createElement ("livre"); book.setAttribute ("id", id); 

Ajout des éléments enfants à la livre est trivial. Par commodité, nous collectons les noms d’éléments requis dans un liste et ajouter les valeurs dans une boucle.

liste elnames = Arrays.asList ("auteur", "titre", "genre", "prix", "date de publication", "description"); for (String elname: elnames) Element el = document.createElement (elname); Text text = document.createTextNode (props.getProperty (elname)); el.appendChild (text); book.appendChild (el);  catalog.appendChild (livre); 

Et c'est comme ça que ça se passe. le catalogue l'élément a maintenant le nouveau livre élément ajouté. Il ne reste plus qu'à écrire le XML mis à jour.

Pour écrire le XML, nous avons besoin d’une instance de Transformateur qui est créé comme indiqué ci-dessous. Notez que nous demandons l’indentation du XML de sortie en utilisant le setOutputProperty () méthode.

TransformerFactory tfact = TransformerFactory.newInstance (); Transformateur tform = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "oui"); tform.setOutputProperty ("http://xml.apache.org/xsltBuchindent-amount", "3"); 

La dernière étape de la génération de la sortie XML consiste à appliquer la transformation. Le résultat apparaît sur le flux de sortie, System.out.

tform.transform (nouveau DOMSource (document), nouveau StreamResult (System.out)); 

Pour écrire la sortie directement dans un fichier, utilisez la commande suivante.

tform.transform (nouveau DOMSource (document), nouveau StreamResult (nouveau fichier ("output.xml"))); 

Et cela termine cet article sur la lecture et l'écriture de fichiers XML à l'aide de l'API DOM.

Avez-vous utilisé l'API DOM dans vos applications? Comment cela s'est-il passé? Veuillez nous en informer dans les commentaires ci-dessous.

En savoir plus sur: Java.