Manipulation et analyse de chaînes XML en Java avec Dom4j

Configuration des dépendances

Pour traiter des documents XML de manière flexible en Java, la bibliothèque Dom4j est une solution de référence. Voici la configuration Maven nécessaire pour l'intégrer à votre projet :

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

Analyse d'une structure XML imbriquée

Dans ce premier scénario, nous traitons une chaîne XML contenant plusieurs entrées répétitives (nodes parents et enfants). L'objectif est d'extraire les données de chaque bloc pour les stocker dans une structure de type liste de dictionnaires.

@Test
public void parseComplexXml() {
    String xmlInput = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                    "<Registry xmlns=\"https://api.example.org\">" +
                    "  <record id=\"101\">" +
                    "    <empId>E001</empId>" +
                    "    <empName>Alice</empName>" +
                    "    <empDept>IT</empDept>" +
                    "  </record>" +
                    "  <record id=\"102\">" +
                    "    <empId>E002</empId>" +
                    "    <empName>Bob</empName>" +
                    "    <empDept>RH</empDept>" +
                    "  </record>" +
                    "</Registry>";

    try {
        Document document = DocumentHelper.parseText(xmlInput);
        Element rootNode = document.getRootElement();
        Iterator<Element> recordIterator = rootNode.elementIterator();

        while (recordIterator.hasNext()) {
            Element record = recordIterator.next();
            List<Element> fields = record.elements();
            Map<String, String> dataMap = new HashMap<>();

            for (Element field : fields) {
                dataMap.put(field.getName(), field.getText());
            }
            
            // Affichage des données extraites pour chaque enregistrement
            System.out.println("Données du record : " + dataMap);
        }
    } catch (DocumentException e) {
        e.printStackTrace();
    }
}

Extraction de données à partir d'un flux XML linéaire

Il arrive souvent que le XML reçu soit formaté sur une seule ligne, contenant parfois des données complexes comme du JSON à l'inttérieur d'une balise. Voici comment itérer sur les éléments de premier niveau pour récupérer les valeurs textuelles nettoyées.

@Test
public void parseFlatXml() {
    String rawXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " +
                   "<EventNotification> " +
                   "<traceId>TX-998877</traceId> " +
                   "<eventType>AUTH_SUCCESS</eventType> " +
                   "<metadata>{\"source\":\"web\",\"retry\":false}</metadata> " +
                   "</EventNotification>";

    try {
        Document doc = DocumentHelper.parseText(rawXml);
        Element root = doc.getRootElement();
        Iterator<Element> it = root.elementIterator();

        System.out.println("Début de l'extraction des champs :");
        while (it.hasNext()) {
            Element node = it.next();
            // Utilisation de getTextTrim() pour supprimer les espaces inutiles
            String nodeName = node.getName();
            String nodeValue = node.getTextTrim();
            
            System.out.println(String.format("Clé: %s | Valeur: %s", nodeName, nodeValue));
        }
    } catch (DocumentException e) {
        System.err.println("Erreur lors du parsing XML : " + e.getMessage());
    }
}

L'utilisation de DocumentHelper.parseText() permet de convertir instantanément une chaîne de caractères en un objet Document manipulable. La méthode elementIterator() est particulièrement efficace pour parcourir les nœuds sans charger l'intégralité de l'arborescence en mémoire de manière complexe, tandis que getTextTrim() assure une récupération propre des données en ignorant les sauts de ligne et tabulations de formatage.

Étiquettes: Java XML Dom4j Parsing Maven

Publié le 2 juin à 03h04