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.