Pour la démo, voici le XML utilisé :

<?xml version="1.0" ?>
<root>
	<level1 id="0">
		<level2 uniqueId="345D7BL">somedata</level2>
	</level1>
</root>

Un fichier archi-basique lu avec Java via le code suivant :

import org.jdom.xpath.*;
import org.jdom.input.*;
import org.jdom.*;
import java.io.*;
import java.util.*;
 
public class Demo
{
	public static void main(String[] args) throws Exception
	{
		File file = new File("file.xml");
 
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(file);
	}
}

C'est ensuite que cela devient intéressant. Dans une autre méthode, il faut récupérer un noeud spécifique grâce à XPath :

public static void test(Document doc) throws Exception
{
	Element root = (Element)doc.getRootElement().clone();
	List nodes = XPath.selectNodes(root, "//level2[@uniqueId='345D7BL']");
 
	System.out.println("Number of results : "+nodes.size());
}

Dans le cas ci-dessus, je fais un clonage de l'élément principal. Cela n'a pas grand intérêt, mais lorsqu'on travaille sur des applications plus complexes qui modifient le XML, il est utile de garder les données initiales et donc de faire du clonage.

Selon toute logique, le code devrait sortir comme résultat '1' puisqu'il n'y a qu'un seul noeud nommé 'level2' dont l'attribut 'uniqueId' a la valeur '345D7BL'. Hors, à l'exécution le résultat sera... 0 :( Pourquoi ?

Visiblement, la requête XPath sus-mentionnée a besoin d'avoir une référence à un Document afin de pouvoir fonctionner. Hors en faisant un clonage, il est bien spécifié dans la documentation que cela 'sépare' l'élément de son parent (dans ce cas, le Document). Par contre, à aucun moment il n'est dit que cela empêchera XPath de fonctionner correctement...

Après y avoir passé un sacré bout de temps, j'ai finalement ouvert un post sur développez, refermé peu après car j'avais trouvé la solution :) Il suffit donc soit de ne pas cloner l'élément, soit de le remettre dans un Document.

Vous trouverez la source de l'exemple en annexe, en espérant vous éviter quelques heures de débuggage ! A noter que vous devrez télécharger la librairie JDOM pour le faire marcher.