Вам необходимо привязать пространства имен к вашему объекту xpath. Вы должны создать объект xpath следующим образом ( Мне нужно было добавить новую запись Cube в ваш xpath):
XPath xpath = XPath.newInstance("/gesmes:Envelope/root:Cube/root:Cube/root:Cube/@currency");
затем добавьте к нему ваши объявления пространства имен:
xpath.addNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
xpath.addNamespace("root", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
Фактически, элемент Envelope имеет "http://www.gesmes.org/xml/2002-08-01" пространство имен uri, в то время как все элементы Cube имеют" http://www.ecb.int/vocabulary/2002-08-01/eurofxref" пространство имен uri, объявленное как пространство имен по умолчанию. Вы можете использовать префикс пространства имен, который хотите в своем xpath, но URI должен совпадать.
Затем выполните поиск по документу, используя этот созданный вами xpath:
List<?> all = xpath.selectNodes(doc);
Я протестировал этот код с вашим xml, и он выдает следующий вывод:
ausgbabe: [Attribute: currency="USD"]
ausgbabe: [Attribute: currency="JPY"]
ausgbabe: [Attribute: currency="BGN"]
ausgbabe: [Attribute: currency="CZK"]
ausgbabe: [Attribute: currency="DKK"]
ausgbabe: [Attribute: currency="GBP"]