sabato 16 giugno 2012

Creare un xml e validarlo con xsd, poi scriverlo su file oppure su una stringa

Si puo' creare un xml in java, validarlo e scrivere il tutto su di un file o una stringa?
Si, eccone un esempio che si può integrare in un metodo (in questo caso ritornerà un tipo String).
Prima creo la root e i nodi del xml, procedo con la sua validazione tramite xsd e scrivo il tutto in un file.
String stringXml = "";

try{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder parser = factory.newDocumentBuilder();
  
    Document doc = parser.newDocument();
    Element childElement = null;
   
    Element root = doc.createElementNS("http://blablabla", "ns1:example");
    doc.appendChild(root);
    root.setAttribute("xmlns", "http://...");
    root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
    root.setAttribute("xsi:schemaLocation", "http://blablabla C:\\xsd\\example.xsd");
   
    childElement = doc.createElement("destinazione");
            childElement.setAttribute("ufficio","blablabla");
    root.appendChild(childElement);
   
    //... eventuali altri childElement
   
    /* validazione xml con xsd */
    SchemaFactory factorySchema =
        SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
    File schemaLocation = new File("c:\\xsd\\example.xsd");
    Schema schema = factorySchema.newSchema(schemaLocation);
    Validator validator = schema.newValidator();
    DOMSource source = new DOMSource(doc);
   
    validator.validate(source);
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT,"yes");
   
    /* scrive l'xml sul file */
    File fileXml = new File("c:\\test\\test.xml");
    StreamResult resultFile =  new StreamResult(fileXml);
    transformer.transform(source, resultFile);
   
    /* oppure scrive sulla stringa */
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    transformer.transform(source, result);
    stringXml = writer.toString();
   

}catch(Exception e){
  throw new Exception(e.getMessage());
}

return stringXml;