java.io.BufferedReader;import java.io.FileReader;e para armazenar o Conteudo do arquivo XML, no definimos o atributo xstream para new XStream(new Dom4JDriver())V) essa funcao na classe XmlUtil fica assim: boolean para retornar se importou com sucesso. public boolean importarArquivoContatos(String F) { this.xstream = new XStream(new Dom4JDriver()); try { getXstream().alias("contato", Contato.class); getXstream().alias("contatos", List.class); getXstream().processAnnotations(Contato.class); BufferedReader input = new BufferedReader(new FileReader(F)); List<Contato> contatos = (List) getXstream().fromXML(input); input.close(); for (Contato C : contatos) { System.out.println("Contato: " + C.getNome() + " - " + C.getTelefone()); } input.close(); return true; } catch (IOException ex) { Logger.getLogger(XmlUtil.class.getName()).log(Level.SEVERE, null, ex); } // arquivos com tags erradas catch (com.thoughtworks.xstream.io.StreamException ex) { System.err.println("Problemas com o arquivo :" + F); Logger.getLogger(XmlUtil.class.getName()).log(Level.SEVERE, null, ex); } return false; }VI) Alterando a funcao importarXml do arquivo frameListaContatos (criado no inicio do passo 8) private void importarXML() { JFileChooser chooser = new JFileChooser("Selecione um arquivo XML"); chooser.setFileFilter(new FileNameExtensionFilter("Arquivos XML", "xml")); int retornoJFC = chooser.showOpenDialog(null); if (retornoJFC == JFileChooser.APPROVE_OPTION) { System.out.println("Arquivo escolhido: \n" + "Pasta: " + chooser.getSelectedFile().getAbsolutePath() + "\n" + "Arquivo: " + chooser.getSelectedFile().getName()); XmlUtil xmlU = new XmlUtil(); String message; boolean importResult = xmlU.importarArquivoContatos(chooser.getSelectedFile().getAbsolutePath()); if (importResult) { message = "Importacao concluida."; // o q fazer com os dados... } else { message = "Importacao com erros.\n" + "Verifique o console."; } JOptionPane.showMessageDialog(rootPane, message); } }VII) Vamos 1o testar com um arquivo XML errado p/ ver esse segundo catch em execucaocrie um arquivo de nome contatos_Import_Errado.xml, veja uma tag nomes e outra telefono<?xml version="1.0" encoding="UTF-8"?><contatos> <contato> <nomes>Joao 1 XML</nome> <telefono>3475-9876</telefone> </contato> <contato> <nome>Cliente 2 XML</nome> <telefone>7654-5432</telefone> </contato></contatos>Salve esse arquivo e Teste o programa, clique no importar XML e escolha o arquivo que esta com erroFigura 22 - teste de importacao de arquivo com tags erradaso resultado deve ser :Figura 23 - resultado do teste de importacao de arquivo com tags erradasVIII) Vamos 1o testar com um arquivo XML correto.crie um arquivo de nome contatos_Import.xml, (pode alterar o q que foi gerado pelo programa)<?xml version="1.0" encoding="UTF-8"?><contatos> <contato> <nome>Joao 1 XML</nome> <telefone>3475-9876</telefone> </contato> <contato> <nome>Cliente 2 XML</nome> <telefone>7654-5432</telefone> </contato> <contato> <nome>Cliente 3 XML</nome> <telefone>8888-3333</telefone> </contato> <contato> <nome>Cliente 4 XML</nome> <telefone>6543-2222</telefone> </contato></contatos>Salve esse arquivo e Teste o programa, clique no importar XML e escolha o arquivo corretoFigura 24 - teste de importacao de arquivo com tags corretas, mas os valores ainda estao apenas no console do NBObserve o Output do NBArquivo escolhido: Pasta: /Users/surfer/contatos_Import.xmlArquivo: contatos_Import.xmlContato: Joao 1 XML - 3475-9876Contato: Cliente 2 XML - 7654-5432Contato: Cliente 3 XML - 8888-3333Contato: Cliente 4 XML - 6543-2222OK. :) os dados estao ai. Mas agora o que fazer?? Em uma situacao real, precisariamos verificar esses dados para nao duplicar registros, ou quando identificar nome ou telefone, perguntar se deseja atualizar o existente. Tambem nao estou utilizando o atributo id na importacao, vou salvar os dados no banco p/ completar o tutorial, mas fica a sugestao de fazer todas as verificacoes necessarias para manter a integridade dos dados.IX) Salvando os dados do XML no banco (acho melhor fazer em outro passo, next)9) Salvando os dados no MysqlObs: Durante os testes vou ter q limpar essa tabela varias vezes (ate acertar, rs), portanto nas imagens capturadas, as vezes