Опция 1 опасна, потому что вы не можете гарантировать префиксы для данного пространства имен без предварительного анализа документа, и потому что вы можете столкнуться с конфликтом пространства имен. Если вы используете документ и ничего не выводите, это может быть нормально, в зависимости от источника документа, но в противном случае он просто теряет слишком много информации.
Вариант 2 может быть применен рекурсивно, но он имеет много тех же проблем, что и вариант 1.
Вариант 3 звучит как лучший подход, но вместо того, чтобы загромождать ваш код, создайте статический метод, который выполняет обе проверки, вместо того, чтобы помещать один и тот же оператор if в вашу кодовую базу.
Лучший подход - заставить того, кто отправляет вам плохой XML, исправить это. Конечно, напрашивается вопрос, действительно ли он сломан. В частности, вы получаете XML, где пространство имен по умолчанию определяется как X, а затем пространству имен, также представляющему X, присваивается префикс «es»? Если это так, то XML правильно сформирован, и вам просто нужен код, который не зависит от префикса, но все еще использует квалифицированное имя для извлечения элемента. Я недостаточно знаком с Dom4j, чтобы знать, приведет ли создание пространства имен с нулевым префиксом к совпадению всех элементов с совпадающим URI или только тех, которые не имеют префикса, но с ним стоит поэкспериментировать.