Por si a alguien le sirve, que a mí me ha traído de cabeza últimamente... Al utilizar expresiones XPath con dom4j, si éstas tienen namespaces (espacios de nombres, xmlns="xmpp:xxx" ...), hay que usar siempre los prefijos o no funcionarán las búsquedas (al contrario que si usamos DOM pelado).
Para hacerlo tenemos que declarar antes los namespaces y luego usar los prefijos asignados:
Map namespaces = new TreeMap();
namespaces.put("x", "http://xmpp.org/namespaces/xxxx");
DocumentFactory.getInstance().setXPathNamespaceURIs(namespaces);
Y luego tendremos que prefijar todos los elementos de la búsqueda XPath que estén dentro de ese espacio de nombres:
String saan = elem.valueOf("//x:SubAdministrativeAreaName");

Historia al azar
Escrito el 27 Octubre 2006
<p>si, estoy completamente de acuerdo</p>