Bonjour,
voilà j'ai un fichier XML que j'ai traité et modifié et je doit maintenant le sérialiser et l'enregistrer dans un fichier XML comment dois-je faire cette dernière étape ? Merci pour votre aide...
Version imprimable
Bonjour,
voilà j'ai un fichier XML que j'ai traité et modifié et je doit maintenant le sérialiser et l'enregistrer dans un fichier XML comment dois-je faire cette dernière étape ? Merci pour votre aide...
Hello,
A peu de chose près c'est :
http://java.developpez.com/faq/xml/?..._DOM_to_string
Faut juste utiliser un FileWriter à la place du StringWriter.
Pouvez vous m'expliquer un peu le code svp
Merci pour votre aide...Code:
1
2
3
4
5
6
7
8
9 Document document = ...; DOMSource domSource = new DOMSource(document); FileWriter writer = new FileWriter(new File(monfichier.xml)); StreamResult result = new StreamResult(writer); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(domSource, result); String stringResult = writer.toString();
Je recommande fortement l'usage de la bibliothèque JDOM, et la lecture de sa JavaDoc. C'est beaucoup plus facile qu'avec la bibliothèque de base Java.
Pour parser du XML, utiliser un SAXBuilder
Pour le retransformer en texte, un XMLOutputter
La je suis dans le cadre des études donc c'est eux qui exigent la technologie à utiliser vous voyez ?:cry:
Heu, ça reste du Java tout ça hein :mrgreen:.
oui c'est du java mais j'ai meme pas trouvé de turoriel qui explique bien dessus... Merci pour votre aide...
Imposer SAX je pourrais encore comprendre, mais imposer le DOM de la bibliothèque de base, je vois pas trop l'intérêt pédagogique -_-°. Le principe fondamental de XML est de gagner du temps, pas d'en perdre.
Enfin... T'y peux rien, mais il vaut mieux que tu le saches. C'est pas XML qui sert à rien : il t'a été mal enseigné, c'est tout.
Merci beaucoup pour votre aide c'est très gentil de votre part... La j'ai un autre problème maintenant c'est la sérialistion avec sax qui me pose problème, ce que j'ai pu comprendre c'est qu'il faut utiliser TransformerHandler...
En effet.
La génération de XML avec SAX est assez peu abordée (je me demande d'ailleurs bien pourquoi, mais passons.) Vois un exemple ici : http://www.javazoom.net/services/new...eneration.html
L'exemple 5, "JAXP + SAX + Serialization"
regardez mon code la c'est ce que je fais mais la ça me crée un fichier vide quoi:
Merci beaucoup d'essayer de m'aider...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 SAXParserFactory fabrique = SAXParserFactory.newInstance(); try { SAXParser parseur= fabrique.newSAXParser(); XMLReader xmlReader =parseur.getXMLReader(); fabrique.setValidating(true); this.setParent(xmlReader); TransformerFactory factory = TransformerFactory.newInstance(); TransformerHandler transformerHandler = ((SAXTransformerFactory) factory).newTransformerHandler(); FileWriter fw = new FileWriter(new File("TP3_visite")); StringWriter sw= new StringWriter(); Transformer serializer = transformerHandler.getTransformer(); StreamResult result = new StreamResult(sw); transformerHandler.setResult(result); String stringresult = sw.toString(); fw.write(stringresult); fw.close();
Ben, forcément. Après avoir bien configuré ton TransformerHandler en lui indiquant où il doit écrire, il faudrait peut-être commencer à lui dire d'y écrire des choses, non ?
startDocument(), startElement(), endElement(), endDocument()... Du SAX, quoi.
ben oui mais d'après ce que j'ai remarqué en redéfinissant la méthode startElement() il l'appelle tout seul
Dans mon cas je lis si c'est ce qui m'arrange je modifie si non je fais rien et a la fin je voudrai avoir mon ancien fichier xml1 et un nouveau qui est ici TP3_xml.xml vous voyez?
Ça c'est quand tu lis. Maintenant, tu essaies de faire le contraire : écrire.
est ce que je suis obligé d'appeler starDocument meme j'en aurais pas besoin???
et quand j'appelle starElement() comment dois-je savoir les attributs qu'elle contient alors que je vais faire des tests ???
Merci de m'aider et excusez mon ignorance...
Je vois pas bien comment tu pourrais ne pas en avoir besoin... Si tu veux générer un document, il faut bien le commencer...
Ah oui, il faut le savoir de toute façon. Les tests, je vois pas ce qu'ils ont à voir avec ça. Il faut les faire, avant, après, je sais pas ce dont t'as besoin, mais en tout cas, quand tu appelles startElement() il faut savoir quels attributs tu vas mettre dedans.
On te l'a dit, que SAX c'est pour travailler à la volée. Eh ben travailler à la volée, c'est ça.
Je comprends toujours pas comment faire vu que je dois commencer le document et tout donc par exemple il y a les balises que je veux changer elle contiennent l'attribut "date-naissance" et les autres ne le contienne pas donc dans mon nouveau document je n'aurais pas tout mon document je n'aurais que ce que j'ai changé c'est ca ?
Non mais en SAX il n'y a pas de notion de "changer."
Soit tu lis un document en SAX : tu reçois les évènements du parseur.
Soit tu écris un document en SAX : tu écris chaque évènement, et le serializeur s'occupe de les écrire en XML.
C'est tout. SAX peut lire un document. SAX peut écrire un document. C'est l'un, ou c'est l'autre. Il n'y a pas d'histoire de modifier.
Bien sûr rien ne t'empêche de construire un reader d'une part sur un fichier, de construire un writer d'autre part vers un autre fichier, et de lire d'un côté, regarder ce que ça donne, et en déduire quelque chose à écrire de l'autre côté.
Mais ça, tu dois le faire tout seul. SAX ne peut pas modifier.
C'est bien rentré, là, maintenant ? Bon. J'ai menti. Il y a un outils pour relier automatiquement un ContentHandler qui lit à un ContentHandler qui écrit. Ça s'appelle XMLFilterImpl. Par défaut il transmet tout de l'un à l'autre sans modification. Mais on peut faire une sous-classe qui redéfinit certaines méthodes, par exemple startElement(), par exemple pour changer les attributs qu'on passe de la lecture à l'écriture.
Ah ben c'est ce que j'utilise moi tenez je vous tout mon code la:
vous voyez??... Merci beaucoup pour votre aide...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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.OutputKeys; 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.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLFilterImpl; public class SaxParser extends XMLFilterImpl { /** * @param args * @throws IOException */ SaxParser () throws IOException{ // le nom c filtre mais on pouvais utiliser handler si on était avec ContentHandler ou DefaultHandler SAXParserFactory fabrique = SAXParserFactory.newInstance(); try { SAXParser parseur= fabrique.newSAXParser(); // si on rajoute pas cette ligne on ne peut pas faire de setContentHandler XMLReader xmlReader =parseur.getXMLReader(); // pour valider le code sans le modifier il faure faire ceci: fabrique.setValidating(true); this.setParent(xmlReader); // par défaut c'est ça: this.setContentHandler(xmlReader.getContentHandler()); // On va sérialisé le document modifié dans un new fichier XML // Ce qu'il faut utiliser Transformer et TranformerFactory // a la place de Transformer je dois utiliser TransformerHandler TransformerFactory factory = TransformerFactory.newInstance(); TransformerHandler transformerHandler = ((SAXTransformerFactory) factory).newTransformerHandler(); FileWriter fw = new FileWriter(new File("TP3_visite")); StringWriter sw= new StringWriter(); Transformer serializer = transformerHandler.getTransformer(); StreamResult result = new StreamResult(sw); transformerHandler.setResult(result); String stringresult = sw.toString(); fw.write(stringresult); fw.close(); transformerHandler.startElement("", "animal", "animal", ); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block System.err.println("Erreur lors de la cconfiguration du parseur"); } catch (SAXException e) { // TODO Auto-generated catch block System.err.println("Erreur de parsing"); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void startElement(String uri, String localName, String qName, Attributes atts) { if (atts.getIndex("date-naissance")!= -1) { System.out.println("Elément rencontré : " + qName + "animal né le: "+ atts.getValue("date-naissance")); DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-mm-dd"); Date date = null; try { date = DATE_FORMAT.parse(atts.getValue("date-naissance")); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } Calendar TODAY = Calendar.getInstance(); Calendar cal = new GregorianCalendar(); cal.setTime(date); // opérations et tests : cal.add(cal.YEAR, 2); if ( cal.after(TODAY) ) { System.out.println("L'animal: "+ qName +"a moins de 2 ans il doit passer la" + "visite médicale"); AttributesImpl attr = new AttributesImpl (atts); attr.addAttribute(null, "", "viste-medicale", "CDATA" , "Animal en bonne santé"); atts= attr; }else{ System.out.println("Cet animal a plus de 2 ans, il n'a pas besoin" + "de passer la visite médicale, Merci"); } } } //fermuture de la class }