Problema ao ler tag de um arquivo xml com XStream

Boa tarde pessoal, estou conseguindo ler todo meu arquivo xml, quando percebi que faltava capturar estes elementos desta tag, utilizei uma função do Xstream e foi fácil, só que o problema é que quando utilizo está função ele não deixa buscar os outros elementos das outras tags da uma java.lang.NullPointerException

:S alguém já teve este problema?

A exceção é bem básica. Trata-se de uma referência nula que tenta executar uma ação .
Verifique na API se ela não oferece forma de verificar se um determinado atributo existe na tag em questão.
Ou se simplesmente tu passar para a API um atributo inexistente na tag, ela gere essa exceção.

Enfim, leia a API que está utilizando e qualquer coisa, posta o código e indique a linha onde o erro é gerado.

vou postar meu código para melhor entendimento,

esta é minha classe que pega os elementos das tags beneficiario

[code]public class ConversorBeneficiario implements Converter {

@Override
public void marshal(Object valor, HierarchicalStreamWriter escreve, MarshallingContext texto) {
    Beneficiario beneficiario = (Beneficiario) valor;
    escreve.addAttribute("cco", beneficiario.getCco());
    escreve.addAttribute("situacao", beneficiario.getSituacao());
    escreve.addAttribute("dataAtualizacao", beneficiario.getDataAtualizacao());


}

@Override
public Object unmarshal(HierarchicalStreamReader ler, UnmarshallingContext texto) {
    Beneficiario beneficiario = new Beneficiario();
    beneficiario.setCco(ler.getAttribute("cco"));
    beneficiario.setSituacao(ler.getAttribute("situacao"));
    beneficiario.setDataAtualizacao(ler.getAttribute("dataAtualizacao"));
    return beneficiario;
}

@Override
public boolean canConvert(Class clazz) {
    return clazz.equals(Beneficiario.class);
}

}
[/code]

esta é a classe que pega o valor dos objetos

[code]public class LerXml implements Runnable {

@Override
public void run() {
    try {
        XStream xstream = new XStream(new Dom4JDriver());
        xstream.processAnnotations(MensagemSIB.class);
        xstream.registerConverter(new ConversorBeneficiario());
        xstream.alias("conferencia", List.class);
        xstream.alias("beneficiario", Beneficiario.class);

        BufferedReader input = new BufferedReader(new FileReader("c:\\fileTeste.xml"));
        MensagemSIB bl = (MensagemSIB) xstream.fromXML(input);

        List<Beneficiario> beneficiarios = bl.getMensagem().getAnsParaOperadora().getConferencia().getBeneficiarios();
        long id = 1;
        for (Beneficiario b : beneficiarios) {
            System.out.println("-----------------------------------------------------------------------------------");
            System.out.println("Numero de registros         :   " + id++);
            System.out.println("CCO                         :   " + b.getCco());
            System.out.println("Situacao                    :   " + b.getSituacao());
            System.out.println("Data atualização            :   " + b.getDataAtualizacao());
            System.out.println("Nome                        :   " + b.getIdentificacao().getNome());
            System.out.println("Sexo                        :   " + b.getIdentificacao().getSexo());
            System.out.println("Cpf                         :   " + b.getIdentificacao().getCpf());
            System.out.println("Nome da mae                 :   " + b.getIdentificacao().getNomeMae());
            System.out.println("Data de Nascimento          :   " + b.getIdentificacao().getDataNascimento());
            System.out.println("Rua                         :   " + b.getEndereco().getLogradouro());
            System.out.println("Numero                      :   " + b.getEndereco().getNumero());
            System.out.println("Bairro                      :   " + b.getEndereco().getBairro());
            System.out.println("Codigo municipio            :   " + b.getEndereco().getCodigoMunicipio());
            System.out.println("Cep                         :   " + b.getEndereco().getCep());
            System.out.println("Tipo endereco               :   " + b.getEndereco().getTipoEndereco());
            System.out.println("Reside no exterior          :   " + b.getEndereco().getResideExterior());
            System.out.println("Complemento                 :   " + b.getEndereco().getComplemento());
            System.out.println("Codigo municipio residencia :   " + b.getEndereco().getCodigoMunicipioResidencia());
            System.out.println("Relacao dependencia         :   " + b.getVinculo().getRelacaoDependencia());
            System.out.println("CCO Beneficiario titular    :   " + b.getVinculo().getCcoBeneficiarioTitular());
            System.out.println("Data contratacao            :   " + b.getVinculo().getDataContratacao());
            System.out.println("Numero plano ANS            :   " + b.getVinculo().getNumeroPlanoANS() );
            System.out.println("Cobertura parcial temporaria:   " + b.getVinculo().getCoberturaParcialTemporaria());
            System.out.println("Itens excluidos cobertura   :   " + b.getVinculo().getItensExcluidosCobertura() );
            System.out.println("Cnpj empresa contratante    :   " + b.getVinculo().getCnpjEmpresaContratante());
            System.out.println("Data cancelamento           :   " + b.getVinculo().getDataCancelamento());
            System.out.println("Data reativacao             :   " + b.getVinculo().getDataReativacao() );
            System.out.println("Numero plano operadora      :   " + b.getVinculo().getNumeroPlanoOperadora() );
        }


        input.close();
    } catch (IOException e) {
    }
}

}
[/code]

quando executo tudo isso junto tenho o seguinte resultado no console

[code]run:
Exception in thread “Thread-0” java.lang.NullPointerException

Numero de registros : 1
CCO : 026997828105
Situacao : ATIVO
Data atualização : 2011-09-05
at br.com.businessflex.controller.LerXML.run(LerXML.java:37)
at java.lang.Thread.run(Thread.java:722)
CONSTRUÍDO COM SUCESSO (tempo total: 16 minutos 7 segundos)[/code]

Se mando rodar o mesmo código apenas tirando a classe ConversorBeneficiario ele lê todo o arquivo setando os valores de CCO, Situação e Data atualização para null.

No seu código postado, qual linha está acusando exceção ?

Logo na primeira linha após a data de atualização quando ele começa a pegar os dados da Classe Identificacao que contém nome… etc…

Então está tendo problema na conversão do seu XML. Verifica o método que gera o seu XML, é lá que deve estar o problema.
Uma curiosidade, tais mexendo com PTU (Protocolo de Transmissão UNIMED) ?

Abraços.

É um arquivo ANS ( agência nacional de saúde), não sou eu que gero nel pego ele pronto, o trabalho é ler e gravar no banco de dados… :S e agora oque poderia fazer?? :roll:

Sim, é que o PTU usa o padrão ANS…trabalhei com ele no ano passado. Bom, a ANS disponibiliza um XSD, tu poderia usar JAXB para gerar um objeto pronto.
Basta passar o XSD, o XML e ele gera o objeto, inclusive, valida ele.

Mas o teu erro não é esse. O que tu precisa analisar é se a tag Identificacao realmente existe no XML que tu está lendo. Se ela não existir, bom, é óbvio que vai gerar NullPointer. Na época, eu tive que fazer tratamentos do tipo:

[code]if(null != getIdentificacao()) {

}[/code]

Porque o schema da ANS indicava que essa tag XML não é obrigatória.
Resumindo, tu precisa conhecer o schema da ANS para identificar quais tags não são obrigatória e fazer os devidos “if´s” no seu código.
Senão, vai ter que entupir de if´s e com certeza terão alguns desnecessários.

Certo obrigado pela dica vou testar com JAXB se é mais simples :smiley:

Isso é opinião minha. A questão é que tu precisa verificar se um objeto não é nulo, caso ele represente uma tag que não é obrigatória.