Fórum ERRO JAXB Unmarshaller #474079

26/03/2014

0

Por favor pessoal, estou com o seguinte problema:

Para o meu arquivo XML de teste estou conseguindo fazer a leitura através do JAXB sem problemas. porém, quando vou testar com o arquivo da empresa em que trabalho, com exatamente as mesmas TAGS, sendo a unica diferença a 1ª linha do arquivo, acontece o erro:

javax.xml.bind.UnmarshalException: unexpected element (uri:"urn:infdiario", local:"DOC_ARQ"). Expected elements are <{}DOC_ARQ>,<{}urn:infdiario>

Meu XML de teste é este (que esta funcionando normalmente):

<?xml version="1.0" encoding="windows-1252" ?>
<DOC_ARQ xmlns:ns2="urn:infdiario">
<CAB_INFORM>
<COD_DOC>1</COD_DOC>
<DT_COMPT>05/03/2014</DT_COMPT>
<DT_GERAC_ARQ>06/03/2014</DT_GERAC_ARQ>
<VERSAO>1.0</VERSAO>
</CAB_INFORM>
<LISTA_INFORM>
<INFORM>
<CNPJ_FDO>Madhya Pradesh</CNPJ_FDO>
<VL_TOTAL>1000000</VL_TOTAL>
<VL_QUOTA>1,518340400000</VL_QUOTA>
<PATRIM_LIQ>70575048,39</PATRIM_LIQ>
<CAPTC_DIA>0,00</CAPTC_DIA>
<RESG_DIA>4445,08</RESG_DIA>
<VL_TOTAL_SAI>37405,68</VL_TOTAL_SAI>
<VL_TOTAL_ATV>70578285,13</VL_TOTAL_ATV>
<NR_COTST>50355</NR_COTST>
<LISTA_COTST_SIGNIF></LISTA_COTST_SIGNIF>
</INFORM>

para leitura do XML abaixo que esta dando problema. (a unica diferença é que o comando "ns2" do namespace não existe):


<?xml version="1.0" encoding="windows-1252" ?>
<DOC_ARQ xmlns="urn:infdiario">
<CAB_INFORM>
<COD_DOC>1</COD_DOC>
<DT_COMPT>05/03/2014</DT_COMPT>
<DT_GERAC_ARQ>06/03/2014</DT_GERAC_ARQ>
<VERSAO>1.0</VERSAO>
</CAB_INFORM>
<LISTA_INFORM>
<INFORM>
<CNPJ_FDO>Madhya Pradesh</CNPJ_FDO>
<VL_TOTAL>1000000</VL_TOTAL>
<VL_QUOTA>1,518340400000</VL_QUOTA>
<PATRIM_LIQ>70575048,39</PATRIM_LIQ>
<CAPTC_DIA>0,00</CAPTC_DIA>
<RESG_DIA>4445,08</RESG_DIA>
<VL_TOTAL_SAI>37405,68</VL_TOTAL_SAI>
<VL_TOTAL_ATV>70578285,13</VL_TOTAL_ATV>
<NR_COTST>50355</NR_COTST>
<LISTA_COTST_SIGNIF></LISTA_COTST_SIGNIF>
</INFORM>


Alguém pode por favor me ajudar com o problema em questão?

Obrigado!
Rafael Albuquerque

Rafael Albuquerque

Responder

Posts

09/05/2014

Rafael Albuquerque

Boa tarde pessoal,

Como ninguém se manifestou sobre a solução do problema de leitura do arquivo xml com o JAXB, e já que agora encontrei uma maneira alternativa, segue abaixo a solução que acredito que vai ajudar quem necessite:


1) Na classe onde faço a leitura do meu arquivo (ou dos meus vários arquivos) faço a chamada para o método "convertXml"
for (int j=0; x < afile.length; x++) {
File arquivos = convertXml(afile[x]);



2) O Método "convertXml" abaixo utiliza o FileManipulator para realizar a leitura do arquivo xml, no mesmo
é criado um arquivo temporário contendo as informações do arquivo original já com a alteração necessária no arquivo (comando replace),

public static File convertXml(File file) throws IOException{

FileManipulator fileManipulator = new FileManipulator();
File temp = File.createTempFile(file.getName(), "");
List<String> lines = fileManipulator.getLines(file);
for(String str : lines){
fileManipulator.writeInFile(temp, str.replace("<DOC_ARQ xmlns", "<DOC_ARQ xmlns:ns2"));
}
temp.deleteOnExit();
return temp;
}


3) A classe abaixo é um leitor txt (FileManipulator)

public class FileManipulator {

public void writeNewFile(String filename, String line) throws IOException {

File file = new File(filename);
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(line);
bw.close();

}

public void writeNewFile(String filename, List<String> line)throws IOException {

File file = new File(filename);
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());

int i = 0;
while (i <= line.size()) {
BufferedWriter bw = new BufferedWriter(fw);
bw.write(line.get(i));
bw.close();
i++;
}
}

public void writeInFile(File wfile, String line) throws IOException {
RandomAccessFile file = new RandomAccessFile(wfile, "rw");
file.seek(file.length());
file.writeBytes(line);
file.close();

}

public void writeInFile(File wfile, List<String> line) throws IOException {
RandomAccessFile file = new RandomAccessFile(wfile, "rw");
int i = 0;
while (i <= line.size()) {
file.seek(file.length());
file.writeBytes(line.get(i));
file.close();
i++;
}
}

public Boolean copyTo(File file, File destino) throws IOException {
return this.copyTo(file, destino.getAbsolutePath()+"/"+file.getName());
}

public Boolean copyTo(File file, String destino) throws IOException {

// destino = destino+"/"+file.getName();
File bfile = new File(destino);

FileInputStream inStream = new FileInputStream(file);
FileOutputStream outStream = new FileOutputStream(bfile);

byte[] buffer = new byte[1024];

int length;
while ((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}

inStream.close();
outStream.close();
return Boolean.TRUE;
}

public List<String> getLines(File file) throws IOException {
List<String> lines = new ArrayList<String>();

FileInputStream fstream = new FileInputStream(file);
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;

while ((strLine = br.readLine()) != null) {


lines.add(strLine);
}
br.close();

return lines;
}

public String getSring(File file) throws IOException {
String lines = "";
FileInputStream fstream = new FileInputStream(file);
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;

while ((strLine = br.readLine()) != null) {
lines += strLine;
}
br.close();

return lines;
}

public File ConverteExcel(File excel) throws IOException, InterruptedException{

File fileNew = null;
File vbs = new File("C:\\vb_converte.vbs");
fileNew = new File(excel.getAbsolutePath().replace(".xlsx", ".xls"));
PrintWriter writer = new PrintWriter(vbs);
writer.println("Dim objExcel");
writer.println("Dim objWorkBook");
writer.println("Set objExcel = CreateObject(\"EXCEL.APPLICATION\")");
writer.println("objExcel.DisplayAlerts = False");
writer.println("Set objWorkBook = objExcel.Workbooks.Open(\""+ excel.getAbsoluteFile() +"\")");
writer.println("objWorkBook.SaveAs \""+ fileNew.getAbsoluteFile() + "\", 1");
writer.println("objWorkBook.Close True");
writer.println("Set objWorkBook = Nothing");
writer.println("Set objExcel = Nothing");
writer.close();

Runtime.getRuntime().exec("cmd.exe /c start " + "C:\\vb_converte.vbs");
int i = 0;
while(i<10&&fileNew.length()<=excel.length()){
Thread.sleep(1000);
i++;
}

vbs.deleteOnExit();

return fileNew;
}

public File ConverteWord(File word) throws IOException, InterruptedException{

File fileNew = null;
File vbs = new File("C:\\vb_converte.vbs");
fileNew = new File(word.getAbsolutePath().replace(".docx", ".doc"));
PrintWriter writer = new PrintWriter(vbs);
writer.println("Dim objWord");
writer.println("Dim objDOC");
writer.println("Set objWord = CreateObject(\"Word.Application\")");
writer.println("objWord.Visible = False");
writer.println("Set objDOC = objWord.Documents.Open(\""+ word.getAbsoluteFile() +"\")");
writer.println("objDOC.SaveAs \""+ fileNew.getAbsoluteFile() + "\", 1");
writer.println("objDOC.Close True");
writer.println("Set objDOC = Nothing");
writer.println("Set objWord = Nothing");
writer.close();

Runtime.getRuntime().exec("cmd.exe /c start " + "C:\\vb_converte.vbs");
int i = 0;
while(i<10&&fileNew.length()<=word.length()){
Thread.sleep(1000);
i++;
}

vbs.deleteOnExit();

return fileNew;
}
}


Responder

Gostei + 0

10/05/2014

Carlos Proença

Olá rafael...
to meio ocupado esses tempos n tenho visto muito o forum.. qnd vj eh só um minuto hehe.

obrigado pela contribuição e parabeins por conseguir resolver ai...

att
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar