segunda-feira, 10 de novembro de 2014

Validar XML contra múltiplos arquivos XSD

Se o XSD de validação de um XML foi quebrado em uma estrutura de diversos arquivos, utilize esse código para validar a integridade do XSD



package samples;

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

public class LeitorXML {

 public static void main(String[] args) {
  File dir = new File (args[0]);
  File[] xsds = dir.listFiles();
  StreamSource[] schemaDocuments = new StreamSource[xsds.length];
  for (int i = 0; i < xsds.length; i++) {
   File xsdFile = xsds[i];
   schemaDocuments[i] = new StreamSource(xsdFile);
  }
  
     Source xmlFile = new StreamSource(new File(args[1]));
     SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
     try {
         Schema schema = schemaFactory.newSchema(schemaDocuments);
         javax.xml.validation.Validator validator = schema.newValidator();
         validator.validate(xmlFile);
         System.out.println("Arquivo XML valido.");
     } catch (Exception e) {
         System.out.println(e.getMessage());
     }
 }

}

Usando JAXB para ler XMLs

Para gerar as classes java utilizando JAXB, você precisa do XSD do arquivo XML.

Com o XSD, você pode gerar as classes utilizando o eclipe ou com o comando de prompt xjc que vem com o pacote do JAXB.


Para o eclipse, utilize a opção exibida no print acima.


package samples;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

import samples.jaxb.ObjectFactory;
import samples.jaxb.Pedido;

public class LeitorXML {

 public static void main(String[] args) {
  try {
   
   // Nunca colocar esse trecho em um loop
   JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
   Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
   
   BufferedInputStream bis = new BufferedInputStream(new FileInputStream("pedido.xml"));
   Pedido pedido = (Pedido) jaxbUnmarshaller.unmarshal(bis);

   System.out.println(pedido.getIdPedido());
   System.out.println(pedido.getRemetente());
   System.out.println(pedido.getDestinatario().getNome());
   System.out.println(pedido.getItem().get(0).getPreco());
  } catch (Exception e) {
   e.printStackTrace();
  }

 }

}

Serializar objetos java

package samples;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class SerializerSample {

 public static void main(String[] args) {
  
  DadosVO dados = new DadosVO();
  dados.setNome("Nome do usuario");
  dados.setMaisDados(new MaisDadosVO());
  dados.getMaisDados().setEndereco("Endereco");
  
  
  File serializedXMLs = new File("c:/Marcel/sampleSerialize.ser");
  
  // se o arquivo existe, deserializa, senao serializa.
  if (serializedXMLs.exists()) {
   try (InputStream file = new FileInputStream(serializedXMLs);
     InputStream buffer = new BufferedInputStream(file);
     ObjectInput input = new ObjectInputStream(buffer);) {
    DadosVO dadosDeserializados = (DadosVO) input.readObject();
    System.out.println("Nome: "+dadosDeserializados.getNome());
    System.out.println("Endereço: "+dadosDeserializados.getMaisDados().getEndereco());
   } catch (Exception ex) {
    ex.printStackTrace();
   }
  } else {
   // serialize the List
   try (OutputStream file = new FileOutputStream(serializedXMLs);
     OutputStream buffer = new BufferedOutputStream(file);
     ObjectOutput output = new ObjectOutputStream(buffer);) {
    output.writeObject(dados);
    System.out.println("objeto serializado.");
   } catch (IOException ex) {
    ex.printStackTrace();
    serializedXMLs.delete();
   }
  }
 }
 
}

Como criar uma planilha com Apache POI

package samples;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class App {

 public static void main(String[] args) {
  try {
   Workbook wb = new HSSFWorkbook();
   
   Sheet sheet = wb.createSheet("Sheet");
   
   // Usado para formatar celulas
   CreationHelper createHelper = wb.getCreationHelper();
      
   // formatador para data
      CellStyle cellStyle = wb.createCellStyle();
         cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));
         
         // formatador para valor monetário
         CellStyle cellStyleValor = wb.createCellStyle();
      cellStyleValor.setDataFormat((short)7);
         
      // Cria primeira linha
      Row row = sheet.createRow(0);
      
      Cell valorMonetario = row.createCell(0);
      valorMonetario.setCellStyle(cellStyleValor);
      valorMonetario.setCellValue(122342.43433);

      Cell data = row.createCell(1);
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      data.setCellValue(sdf.parse("2014-02-12"));
      data.setCellStyle(cellStyle);

      // Grava uma formula na linha
      Cell valorRCOReal = row.createCell(2);
      valorRCOReal.setCellType(Cell.CELL_TYPE_FORMULA);
      valorRCOReal.setCellStyle(cellStyleValor);
   valorRCOReal.setCellFormula("ROUND(A1,2)");

   
   // redimensiona a coluna para
   sheet.autoSizeColumn(0);
   sheet.autoSizeColumn(1);
   sheet.autoSizeColumn(2);

   FileOutputStream fileOut = new FileOutputStream("c:/Marcel/PlanilhaSample.xls");
   wb.write(fileOut);
   wb.close();
   fileOut.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}