Comment lire et écrire des fichiers XML avec du code

Comment lire et écrire des fichiers XML avec du code

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





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 décliné ces dernières années, vous pouvez le rencontrer occasionnellement, il est donc important d'apprendre à travailler avec du code.





Java Standard Edition (SE) inclut 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:





  • JUGEMENT: Le modèle d'objet de document comprend des classes pour travailler avec des artefacts XML tels que des éléments, des nœuds, 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é pour travailler avec de gros fichiers XML.
  • SAXO: L'API simple pour XML est un algorithme événementiel pour la lecture de XML. Ici, XML est traité en déclenchant des événements trouvés lors de la lecture de XML. Les besoins en mémoire pour utiliser cette méthode sont faibles, mais travailler avec l'API est plus complexe que de travailler avec le DOM.
  • StAX : L'API Streaming pour XML est un ajout récent aux API XML et fournit un filtrage, un traitement et une modification de flux hautes performances de XML. Bien qu'il évite de charger l'intégralité du document XML en mémoire, il fournit une architecture de type pull plutôt qu'une architecture événementielle, 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 pour 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 démontrons les concepts en utilisant l'exemple XML suivant, qui peut être trouvé ici :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

Lire un fichier XML

Examinons les étapes de base requises pour lire un fichier XML à l'aide de l'API DOM.

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





comment retourner des colonnes dans excel
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

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

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

Et c'est tout, les gars ! L'API DOM pour lire un XML est vraiment simple. Vous avez maintenant accès à l'ensemble du document XML à partir de son élément racine, catalogue . Voyons maintenant comment travailler avec.





Utilisation de l'API DOM

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

Obtenez tous les livre enfants de l'élément racine et boucle sur eux. Noter que getChildNodes() Retour tous les enfants, y compris le texte, les commentaires, etc. Pour notre objectif, nous avons besoin uniquement des éléments enfants, nous ignorons donc les autres.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; 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 voir, la procédure consiste à obtenir la liste des nœuds enfants et à les parcourir en boucle pour sélectionner les nœuds d'élément portant le nom spécifié.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; 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 . De plus, le contenu du texte peut être divisé en plusieurs nœuds de texte adjacents. Ainsi, le traitement spécial suivant est requis pour récupérer le contenu du texte dans un élément.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Armés de ces fonctions pratiques, examinons maintenant du code pour répertorier certaines informations de notre exemple XML. Nous aimerions afficher des informations détaillées pour chaque livre, telles qu'elles seraient disponibles dans un catalogue de livres.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; 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
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

Écrire une sortie XML

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

A titre d'exemple, ajoutons un nouveau livre élément au catalogue d'exemples présenté ci-dessus. Les détails du livre (comme auteur , Titre , etc.) peut être obtenu 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
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

La première étape consiste à analyser le fichier XML existant à l'aide de la méthode présentée ci-dessus. Le code est également affiché ci-dessous.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = 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 = ...;
Properties 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('author');
String title = props.getProperty('title');
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.

combien remplacer la batterie macbook air
Element book = document.createElement('book');
book.setAttribute('id', id);

Ajout des éléments enfants au livre est trivial. Pour plus de commodité, nous collectons les noms d'éléments requis dans un Lister et ajoutez les valeurs dans une boucle.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', '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(book);

Et c'est comme ça qu'on fait. Les catalogue é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();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-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, Système.out .

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

Pour écrire la sortie directement dans un fichier, utilisez ce qui suit.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

Et cela conclut 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 a-t-il fonctionné ? Veuillez nous en informer dans les commentaires ci-dessous.

Partager Partager Tweeter E-mail Canon vs Nikon : quelle marque d'appareil photo est la meilleure ?

Canon et Nikon sont les deux plus grands noms de l'industrie de l'appareil photo. Mais quelle marque propose la meilleure gamme d'appareils photo et d'objectifs ?

Lire la suite
Rubriques connexes
  • La programmation
  • Java
A propos de l'auteur Jay Sridhar(17 articles publiés) Plus de Jay Sridhar

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner