Transformer un très gros fichier XML avec XSL
Bonjour,
Je débute dans l'utilisation d'XML avec Java et je suis confronté à un petit problème.
J'ai lu sur Internet que SAX était évènementiel et consommait peu de mémoire ce qui était particulièrement intéressant pour la manipulation de gros fichiers XML.
Dans le code que j'écris ci-dessous, j'utilise SAX (ou en tout cas je crois que je l'utilise) pour transformer mon document XML avec une feuille XSL. Le problème est que cette transformation prend quelques 450Mo en mémoire pour transformer le flux initial XML de 40Mo.
Les fichiers de production pourront atteindre quelques 200Mo et je cherche donc à trouver une solution peu consommatrice de mémoire et pouvant traiter des très gros fichiers XML.
Le code écrit ci-dessous est-il correct ? Pourquoi ai-je tant de consommation mémoire si j'utilise SAX ?
Merci par avance pour toute l'aide que vous pourrez m'apporter.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
package xml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class XSLTransformer3 {
public static void main(String[] args) {
try {
System.setProperty("org.xml.sax.driver", "org.apache.xerces.parsers.SAXParser");
XMLReader analyseurSax = XMLReaderFactory.createXMLReader();
InputSource sourceEntreeXSL = new InputSource(new FileInputStream("feuille.xsl"));
SAXSource sourceXSL = new SAXSource(analyseurSax, sourceEntreeXSL);
InputSource sourceEntreeXML = new InputSource(new FileInputStream("grosFichier.xml")); // > à 200Mo
SAXSource sourceXML = new SAXSource(analyseurSax, sourceEntreeXML);
TransformerFactory fabrique = TransformerFactory.newInstance();
Templates modeles = fabrique.newTemplates(sourceXSL);
Transformer transformateur = modeles.newTransformer();
transformateur.setOutputProperty(OutputKeys.METHOD, "xml");
transformateur.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
transformateur.setOutputProperty(OutputKeys.INDENT, "no");
File oFic = new File("resultat.xml"); // fichier obtenu après transformation
FileOutputStream fos = new FileOutputStream(oFic);
if (fos != null) {
Result sortie = new StreamResult(fos);
transformateur.transform(sourceXML, sortie);
}
fos.flush();
fos.close();
}
catch (TransformerConfigurationException e) {
e.printStackTrace();
}
catch (SAXException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (TransformerException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
} |