Classe utilitaire pour parser des xml avec xpath et dom.

Soyez le premier à donner votre avis sur cette source.

Vue 13 776 fois - Téléchargée 633 fois

Description

Après recherche sur la notion XPATH sur le site je n'ai pas trouvé mon bonheur. Je présente une classe utilitaire simple sans grande prétention permettant de faciliter le parsing de XML en utilisant des expressions XPATH.

Source / Exemple :


import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**

  • Classe utilitaire pour parsing Xpath avec DOM.
*
  • @author Celphys
  • /
public final class XPathUtils { /**
  • Suppression du contructeur par defaut.
  • /
private XPathUtils () { } /**
  • Construction d'un objet DOM depuis un flux entrant.
*
  • @param is
  • flux en entrée
  • @throws ParserConfigurationException
  • erreur configuration parser
  • @throws IOException
  • erreur lecture flux
  • @throws SAXException
  • erreur parsing flux
  • @throws ParserConfigurationException
  • exception business retrouvé
  • @return un objet document dom
  • /
public static Document getDomDocumentFromStream(final InputStream is) throws SAXException, IOException, ParserConfigurationException { return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); } /**
  • Evaluation d'une expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @param retour
  • type élément retourné.
  • @return
  • element du XML.
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • /
private static Object getValueFromXPathDOM(final Document document, final String expression, final QName retour) throws XPathExpressionException { XPathFactory myXPathFactoy = XPathFactory.newInstance(); XPathExpression exp = myXPathFactoy.newXPath().compile(expression); return exp.evaluate(document, retour); } /**
  • Récupération d'un attribut de type 'chaine de caractère' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @return
  • attribut recherché
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • /
public static String getStringAttributeValueFromXPathDOM(final Document document, final String expression) throws XPathExpressionException { return (String) getValueFromXPathDOM(document, expression, XPathConstants.STRING); } /**
  • Récupération d'un attribut de type 'nombre' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @return
  • attribut recherché
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • /
public static Double getDoubleAttributeValueFromXPathDOM(final Document document, final String expression) throws XPathExpressionException { return (Double) getValueFromXPathDOM(document, expression, XPathConstants.NUMBER); } /**
  • Récupération d'un attribut de type 'boolean' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @return
  • attribut recherché
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • /
public static Boolean getBooleanAttributeValueFromXPathDOM(final Document document, final String expression) throws XPathExpressionException { return (Boolean) getValueFromXPathDOM(document, expression, XPathConstants.BOOLEAN); } /**
  • Récupération d'un attribut de type 'date' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @param sdf
  • simple date format to parse attribute
  • @return
  • attribut recherché
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • @throws ParseException
  • erreur lors du parsing de la date, pattern non respecté.
  • /
public static Date getDateAttributeValueFromXPathDOM(final Document document, final String expression, final SimpleDateFormat sdf) throws XPathExpressionException, ParseException { String value = getStringAttributeValueFromXPathDOM(document, expression); return sdf.parse(value); } /**
  • Récupération d'un attribut de type 'date' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @param datePattern
  • pattern pour la date.
  • @return
  • attribut recherché.
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • @throws ParseException
  • erreur lors du parsing de la date, pattern non respecté.
  • /
public static Date getDateAttributeValueFromXPathDOM(final Document document, final String expression, final String datePattern) throws XPathExpressionException, ParseException { /* Note :
  • Si un seul pattern dans votre application, préféré la méthode avec le simpleDateFormat pour ne pas recompiler
  • le pattern du SimpleDateFormat a chaque appel.
  • /
SimpleDateFormat localSdf = new SimpleDateFormat(datePattern); return getDateAttributeValueFromXPathDOM(document, expression, localSdf); } /**
  • Récupération d'un attribut de type 'date' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @param sdf
  • simple date format.
  • @return
  • attribut recherché.
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • @throws ParseException
  • erreur lors du parsing de la date, pattern non respecté.
  • /
public static Calendar getCalendarAttributeValueFromXPathDOM(final Document document, final String expression, final SimpleDateFormat sdf) throws XPathExpressionException, ParseException { Date adate = getDateAttributeValueFromXPathDOM(document, expression, sdf); Calendar aCalendar = Calendar.getInstance(); aCalendar.setTime(adate); return aCalendar; } /**
  • Récupération d'un attribut de type 'date' depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @param datePattern
  • pattern pour la date.
  • @return
  • attribut recherché.
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • @throws ParseException
  • erreur lors du parsing de la date, pattern non respecté.
  • /
public static Calendar getCalendarAttributeValueFromXPathDOM(final Document document, final String expression, final String datePattern) throws XPathExpressionException, ParseException { Date adate = getDateAttributeValueFromXPathDOM(document, expression, datePattern); Calendar aCalendar = Calendar.getInstance(); aCalendar.setTime(adate); return aCalendar; } /**
  • Récupération d'un attribut de type chaine de caractère depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @return
  • attribut recherché
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • /
public static Node getNodeFromXPathDOM(final Document document, final String expression) throws XPathExpressionException { return (Node) getValueFromXPathDOM(document, expression, XPathConstants.NODE); } /**
  • Récupération d'un attribut de type chaine de caractère depuis son
  • expression XPATH.
*
  • @param document
  • document DOM.
  • @param expression
  • expression xpath.
  • @return
  • attribut recherché
  • @throws XPathExpressionException
  • erreur lors de la validation du XPATH.
  • /
public static NodeList getNodeListFromXPathDOM(final Document document, final String expression) throws XPathExpressionException { return (NodeList) getValueFromXPathDOM(document, expression, XPathConstants.NODESET); } /**
  • Méthode pour tests.
  • Contenu du document Exemple :
*
  • <racine>
  • <balise url="javafr" sourcefonctionne="true" annee="2007" miseenligne="28/08/2007">
  • <fichier nom="undocument.xml" />
  • <fichier nom="unautredocument.xml" />
  • </balise>
  • </racine>
*
  • @param args
  • arguments.
  • /
public static void main(final String[] args) { // A Configurer String CHEMIN_FICHIER_POUR_VOS_TESTS = "D:/exemple.xml"; try { FileInputStream fis = new FileInputStream(CHEMIN_FICHIER_POUR_VOS_TESTS); Document docDOM = XPathUtils.getDomDocumentFromStream(fis); // Attribut de type String String url = (String) XPathUtils.getStringAttributeValueFromXPathDOM(docDOM, "/racine/balise/attribute::url"); System.out.println("URL : " + url); // Attribut de type integer Double annee = (Double) XPathUtils.getDoubleAttributeValueFromXPathDOM(docDOM, "/racine/balise/attribute::annee"); System.out.println("ANNEE : " + annee); // Attribut de type boolean Boolean bool = (Boolean) XPathUtils.getBooleanAttributeValueFromXPathDOM(docDOM, "/racine/balise/attribute::sourcefonctionne"); System.out.println("BOOLEAN : " + bool); // Attribut de type Date String pattern = "DD/MM/yyyy"; Date date = (Date) XPathUtils.getDateAttributeValueFromXPathDOM(docDOM, "/racine/balise/attribute::miseenligne", pattern); System.out.println("DATE : " + date); // Attribut de type NodeSet NodeList list = XPathUtils.getNodeListFromXPathDOM(docDOM, "/racine/balise/fichier"); System.out.println("Longueur : " + list.getLength()); // Attribut de type Node Node noeud = (Node) XPathUtils.getNodeFromXPathDOM(docDOM, "/racine/balise"); System.out.println("Fichier : " + noeud.getNodeName()); } catch (Exception e) { e.printStackTrace(); } } }

Conclusion :


La méthode main est à sortir de la classe utilitaire. Elle propose un exemple pour se faire une meilleure idée des l'applications de cette classe.
Je joins un fichier exemple de xml.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
31
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
8 mai 2008

BONJOUR j'ai utiliser votre programme je trouve qui il est tré bien structurée merci, mais j'ai utiliser un exemple mais j'ai que la taille des balises j'ai souhaiter avoir en sortie un fichier xml en arboressence merci votre aide, si vous pouvez m'aider.
Messages postés
342
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
6 novembre 2012

Merci beaucoup Celphys2 : çela répond parfaitement à ma question :)
Messages postés
8
Date d'inscription
vendredi 24 mars 2006
Statut
Membre
Dernière intervention
3 mars 2009

Vous avez parfaitement raison. En regardant le contenu de la méthode main je m'aperçois que "DOMUtils" (ancien nom de la classe) est à remplacer par le nouveau de la classe à savoir XPathUtils. Je corrige le code immédiatement.
Messages postés
31
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
8 mai 2008

BONJOUR j'ai utiliser la classe utilitaire mais une erreur s'affiche au niveau de :

private DOMUtils() {
}

et j'ignore pour qoi ? merci.
Messages postés
49
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
19 août 2010

bravo l'ami ;)
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.