Bonjour,

Je me suis inspiré de la Faq Java sur ce site pour essayer de créer un fichier XML avec SAX.

Voici le code (partie essentielle) de mon reader
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
public void parse(InputSource source) throws IOException, SAXException {
        // TODO Auto-generated method stub
        if(!(source instanceof SeriesSource))
            throw new SAXException("la source doit être un Objet \"SerieSource\"");
        if(contentHandler == null)
            throw new SAXException("le gestionnaire de contenu ne doit pas être null");
        SeriesSource serie = (SeriesSource) source;
        ArrayList<Series> lserie = serie.getSeries();
        contentHandler.startDocument();
        contentHandler.startElement("", "vnr", "vnr", atts);
 
        for(Series ser:lserie){
            ArrayList<Scenario> lsc = ser.getSerie();
            atts.addAttribute("", "nomserie", "nomserie", "", ser.getNomDeSerie());
            atts.addAttribute("", "option", "option", "", ser.getEnvOption());
            contentHandler.startElement("", "serie", "serie", atts);
            atts.clear();
 
            for(Scenario sc: lsc){
                /*if(sc.getTimeOption())
                    atts.addAttribute("", "time", "time", "", "ok");*/
                contentHandler.startElement("", "scenario", "scenario", atts); //debut du scenario
                atts.clear();
                contentHandler.startElement("", "nom", "nom", atts); //debut de la balise nom
                char[] ch = sc.getNom().toCharArray();
                contentHandler.characters(ch, 0, ch.length);
                contentHandler.endElement("", "nom","nom"); // fin de la balise nom
 
                contentHandler.startElement("", "param", "param", atts);
                 ch = sc.getParam().toCharArray();
                contentHandler.characters(ch, 0, ch.length);
                contentHandler.endElement("", "param", "param");
 
                contentHandler.endElement("", "scenario", "scenario"); // fin du scenario
            }
            contentHandler.endElement("", "serie", "serie");
        }
        contentHandler.endElement("", "vnr", "vnr");
        contentHandler.endDocument();
    }
    public void setContentHandler(ContentHandler cthdl) {
        // TODO Auto-generated method stub
        this.contentHandler = cthdl;
    }
public ContentHandler getContentHandler() {
        // TODO Auto-generated method stub
        return contentHandler;
    }
Voici la classe qui permet d'écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
public class VnrWriter{
    Transformer tr;
    VnrWriterHandler writerHandler;
    public VnrWriter(){
        TransformerFactory fabrique = TransformerFactory.newInstance();
        try {
            tr = fabrique.newTransformer();
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        tr.setOutputProperty(OutputKeys.INDENT, "yes");
        tr.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
        writerHandler = new VnrWriterHandler();
    }
 
    public void xlmWriter(SeriesSource serieSource,File dest){
        Source source = new SAXSource(writerHandler, serieSource);
        try {
            tr.transform(source, new StreamResult(dest));
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            System.out.println(e.getLocator());
            e.printStackTrace();
        }
    }
}
enfin je l'utilise comme ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
public class TestWriter {
    private VnrReader lecteurXML;
    private ArrayList<Series> listeEntree;
    private File fichier_ko;
    private VnrWriter ecrivain;
 
    public TestWriter(){
        try {
            lecteurXML = new VnrReader(new FileInputStream("vnrfile.xml"));
            fichier_ko = new File("fich_ko");
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        listeEntree = lecteurXML.getVnr();
        DateFormat sdt = new SimpleDateFormat("hh:mm");
        //DateFormat date = DateFormat.getDateInstance();
        System.out.println(listeEntree);
        ecrivain = new VnrWriter();
    }
    public void go(){
        ecrivain.xlmWriter(new SeriesSource(listeEntree), fichier_ko);
    }
 
    public static void main(String[] args){
        TestWriter tw = new TestWriter();
        tw.go();
    }
}
mais à chaque fois que j'exécute, j'ai une exception:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
ERREUR :  ''
null
javax.xml.transform.TransformerException: java.lang.NullPointerException
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    at traitement.VnrWriter.xlmWriter(VnrWriter.java:37)
    at traitement.TestWriter.go(TestWriter.java:36)
    at traitement.TestWriter.main(TestWriter.java:41)
Caused by: java.lang.NullPointerException
    at com.sun.org.apache.xml.internal.serializer.ToStream.writeAttrString(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToStream.processAttributes(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToStream.closeStartTag(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToStream.startElement(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.startElement(Unknown Source)
    at traitement.VnrWriterHandler.parse(VnrWriterHandler.java:89)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(Unknown Source)
    ... 5 more
---------
java.lang.NullPointerException
    at com.sun.org.apache.xml.internal.serializer.ToStream.writeAttrString(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToStream.processAttributes(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToStream.closeStartTag(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToStream.startElement(Unknown Source)
    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.startElement(Unknown Source)
    at traitement.VnrWriterHandler.parse(VnrWriterHandler.java:89)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
    at traitement.VnrWriter.xlmWriter(VnrWriter.java:37)
    at traitement.TestWriter.go(TestWriter.java:36)
    at traitement.TestWriter.main(TestWriter.java:41)
Quelqu'un saurait-il me dire ce qui ne va pas dans mon code ?

Merci d'avance pour vos suggestions