Hola compañeros

tengo un problema y no se si se pueda resolver es lo siguiente:
tengo un xml para leerlo utilizo jespxml pero lo que me causa problema es que tengo que hacer una validacion la cual cosiste en que
Si viene un atributo lo pueda extraer pero si no viene que el programa siga y no termine esto se que lo puedo realizar con un if pero ya lo intente y no puedo el siguiente codigo es como lo extrigo normal pero si pero si no trae el NOMBRE me marca null el atributo no existe y ya que nombre en el xml es opcional

raiz = xml.leerXML();
            Tag emisor = raiz.getTagHijoByName("cfdi:Emisor");
            System.out.println(emisor);
            String rfc = emisor.getValorDeAtributo("rfc");
            System.out.println(rfc);
            String  nombre = emisor.getValorDeAtributo("nombre");//opcional
            System.out.println(nombre);

y lo que quiro es que si no viene el atributo NOMBRE se siga y no me mande la exception de que el atributo no se encontro por que que traiga el nombre es opcional y esto es lo que estoy haciendo pero no me funciona porque me sigue mandando la excepcion null no existe atributo nombre

raiz = xml.leerXML();
            Tag emisor = raiz.getTagHijoByName("cfdi:Emisor");
            System.out.println(emisor);
            String rfc = emisor.getValorDeAtributo("rfc");
            System.out.println(rfc);
            if(emisor.getValorDeAtributo("nombre")==null){
                System.out.println("no tiene nombre");
            }else{
            String  nombre = emisor.getValorDeAtributo("nombre");//opcional
            System.out.println(nombre);}

ya llevo mucho tiempo atorado por favor necesito ayuda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

El problema está en la

El problema está en la biblioteca que usaste

https://code.google.com/p/analizador-xml/source/browse/trunk/src/org/jes...

    public String getValorDeAtributo(String nombre) throws AtributoNotFoundException {
        for (Atributo a : this.atributos) {
            if (a.getNombre().equalsIgnoreCase(nombre)) {
                return a.getValor();
            }
        }
        throw new AtributoNotFoundException("Atributo no encontrado. Nombre: "+nombre);
    }

Si no encuentra el atributo lanza esa excepción y no null como tu esperas.

Puedes

  • Opcion 1.

Cambiar de biblioteca y usar una mejor, puedes usar FasterXML/jackson-dataformat-xml que puede crear una instancia de tu objeto usando el XML de entrada:

Esta clase:

// Una clase
public class Simple {
    public int x = 1;
    public int y = 2;
}

Usando este xml

// Con el xml
<Simple>
  <x>1</x>
  <y>2</y>
</Simple>

Se puede leer así:

ObjectMapper xmlMapper = new XmlMapper();
Simple value = xmlMapper.readValue( elXMLAqui, Simple.class);

Y tiene varias opciones para manejar atributos nulos

  • Opcion 2.

Cambia de biblioteca y usa la que trae Java por default https://docs.oracle.com/javase/tutorial/jaxp/

Este puede ser más complicada de usar, pero quizá es lo que necesites si quieres examinar cada nodo de tu XML de forma individual, aunque lo mejor sería leerlo a un objeto java y luego validar ahí si tal o cual atributo es null o no ( o sea la opción 1)

  • Opcion 3.

La biblioteca que estás usando es open source, puedes bajar una copia y modificar lo que no funciona ( en este caso que no tire excepción sino que regrese null como esperas )

  • Opcion 4.

Ponerle un try/catch aunque sinceramente esta es solo hacer peor las cosas.

Si tu razón para no cambiar de biblioteca es que ya invertiste mucho tiempo en ella, piensa en todo el tiempo que vas a seguir perdiendo. Quizá lo único que necesitas es leer un XML y llenar un objeto. Luego usar ese objeto para tomar decisiones, si este es tu caso no tiene sentido estar lidiando con nodos de xml de forma individual.

Suerte