Bonjour,

j'utilise la lib libxml2 pour parser puis écrire un fichier xml de données.

Pour cela j'utilise le code ci-dessous :

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
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
 
  /* parse the file */
  doc = xmlParseFile(xmlFile);
  if(doc == NULL) {
    fprintf(stderr, "error: could not parse the file %s\n",xmlFile);
    return 1;
  }
 
  /* get the root element node */
  cur = xmlDocGetRootElement(doc);
  if(cur == NULL) {
    fprintf(stderr, "empty doc %s\n", xmlFile);
    xmlFreeDoc(doc);
    return 1;
  }
 
/* le code parcours ensuite les données xml en faisant progresserle pointeur "cur" */
/* les données sont stockées dans une liste chaînée pour traitement */
 
  /* free the document */
  xmlFreeDoc(doc);
 
  /* free the global variables that may have been 
   * allocated by the parser */
  xmlCleanupParser();
 
/* on travaille avec la liste chaînée pour ensuite écrire le fichier XML avec les données retraitées en appelant la fonction : 
 
writeXmlData(struct accesLC * liste, char * fileOut) {
  int err = 0;
  xmlTextWriterPtr writer;
  xmlChar *tmp;
 
  /* Create a new xmlWriter for fileOut */
  writer = xmlNewTextWriterFilename(fileOut, 0);
  if(writer == NULL) {
    fprintf(stderr,"writeXmlData: Error creating the xml writer fileout=%s\n",fileOut);
    return 1;
  }
 
  /* Start the document with encoding */
  err = xmlTextWriterStartDocument(writer, NULL, "ISO8859-1", NULL);
  if(err < 0) {
    fprintf(stderr,"writeXmlData: Error at xmlTextWriterStartDocument\n");
    xmlFreeTextWriter(writer);
    return 1;
  }
 
  /* First element is datafeed */
  err = xmlTextWriterStartElement(writer, BAD_CAST "datafeed");
  if(err < 0) {
    fprintf(stderr,"writeXmlData: Error at xmlTextWriterStartElement for datafeed\n");
    xmlTextWriterEndDocument(writer);
    xmlFreeTextWriter(writer);
    return 1;
  }
  /* Retour à la ligne */
  err = xmlTextWriterWriteRaw(writer, "\n");
  if(err < 0) {
    fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteComment writing date\n");
    xmlTextWriterEndDocument(writer);
    xmlFreeTextWriter(writer);
    return 1;
  }
 
  while(liste->last != NULL) {
 
    /* Secund element is point, as child of datafeed */
    err = xmlTextWriterStartElement(writer, BAD_CAST "point");
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterStartElement for point\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    /* Add the attribute f101 f102 f103 f104 with his value */
    err = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "f101", "%f", 
					    liste->last->data->f101);
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteAttribute for correl\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    err = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "f102", "%f", 
					    liste->last->data->f102);
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteAttribute for correl\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    err = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "f103", "%f", 
					    liste->last->data->f103);
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteAttribute for correl\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    err = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "f104", "%f", 
					    liste->last->data->f104);
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteAttribute for correl\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    /* Write the date as child of point */
    err = xmlTextWriterWriteFormatRaw(writer, "%s", liste->last->data->date);
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteComment writing date\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    /* Close the element named point */
    err = xmlTextWriterEndElement(writer);
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterEndElement for point err=%d\n", err);
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    /* Retour à la ligne */
    err = xmlTextWriterWriteRaw(writer, "\n");
    if(err < 0) {
      fprintf(stderr,"writeXmlData: Error at xmlTextWriterWriteComment writing date\n");
      xmlTextWriterEndDocument(writer);
      xmlFreeTextWriter(writer);
      return 1;
    }
 
    liste->last = liste->last->prev;
  } 
 
  /*fin du document */
  /* Here we could close the elements datafeed using the
   * function xmlTextWriterEndElement, but since we do not want to
   * write any other elements, we simply call xmlTextWriterEndDocument,
   * which will do all the work. */
  err = xmlTextWriterEndDocument(writer);
  if (err < 0) {
    fprintf(stderr,"writeXmlData : Error at xmlTextWriterEndDocument\n");
    xmlFreeTextWriter(writer);
    return 1;
  }
 
  xmlFreeTextWriter(writer);
 
  return 0;
}

Mon problème : ce code génère énormément d'accès disque. Je voulais donc savoir si j'utilise correctement la lib libxml2 pour écrire mon fichier ?

J'ai cru comprendre que l'appel : writer = xmlNewTextWriterFilename(fileOut, 0);
me permet de travailler en mémoire avec un pointeur et que c'est l'appel à : xmlTextWriterEndDocument(); qui fait l'écriture sur disque.

Je me trompe ????

merci pour vos réponses.

Floopi