@@ -206,19 +206,39 @@ Otra gran diferencia respecto a la traducción a |JSON| es que en |XML| nos hemo
206206visto obligados a crear un elemento contenedor de la secuencia llamado
207207``<centro> ``. No contiene más información que la propia secuencia, por lo que en
208208el modelo de datos no se traduce en una nueva clase. En *Java *, simplemente,
209- existirá un dato de tipo ``Grupo[] `` o ``List<Grupo> ``.
209+ existirá un dato de tipo ``Grupo[] `` o ``List<Grupo> ``. Si intentáramos traducir
210+ directamente estos tipos de datos a |XML |, la librería no nos permitiría definir
211+ el nombre de la etiqueta para el envoltorio (queremos que sea ``<centro> ``) ni
212+ tampoco qué etiqueta tendría cada uno de los elementos de la secuencia (utiliza
213+ el predeterminado ``<item> ``) por lo que obtendríamos una salida semejante a
214+ esta:
210215
211- Por eso, para poder hacer la traducción a |XML | necesitamos añadir una clase
212- envoltorio auxiliar:
216+ .. code-block :: xml
217+
218+ <List1 > <!-- O alguna etiqueta semejante -->
219+ <item nivel =" 1" etapa =" 2" grupo =" D" >
220+ <!-- Elementos del grupo (nombrados correctamente) -->
221+ </item >
222+
223+ <!-- Otro grupos con la etiqueta item -->
224+ </List1 >
225+
226+ Para solucionar esto tenemos dos soluciones:
227+
228+ .. rubric :: Clase envoltorio auxiliar
213229
214230.. code-block :: java
215231 : emphasize- lines: 1 , 3 , 4
216232
217233 @JsonRootName (" centro" )
218- private class GrupoWrapper {
234+ private class GruposWrapper {
219235 @JacksonXmlElementWrapper (useWrapping = false )
220236 @JacksonXmlProperty (localName = " grupo" )
221- private Grupo [] grupos;
237+ public Grupo [] grupos;
238+
239+ public GruposWrapper (Grupo [] grupos ) {
240+ this . grupos = grupos;
241+ }
222242 }
223243
224244 Las particularidades de este código son las siguientes:
@@ -233,6 +253,37 @@ Las particularidades de este código son las siguientes:
233253+ El nombre del elemento es ``<grupo> ``, no ``<grupos> ``, así que es necesaria
234254 también la anotación ``@JacksonXmlProperty ``.
235255
256+ Una vez definida la clase, basta con que sea una instancia de ella la que se
257+ escriba (o lea):
258+
259+ .. code-block :: java
260+
261+ // Escritura
262+ mapper. writeValue(new GruposWrapper (grupos));
263+ // Lectura
264+
265+ Grupo [] grupos = mapper. readValue(st, GruposWrapper . class). grupos;
266+
267+ .. rubric :: Mapa envoltorio
268+
269+ Consiste en improvisar un mapa con una única clave que sea el nombre que
270+ queremos darle a los elementos de la secuencia:
271+
272+ .. code-block :: java
273+ : emphasize- lines: 1 , 4
274+
275+ Map<String , Object > centro = Map . of(" grupo" , grupos); // Se usará <grupo>, no <item>
276+
277+ ObjectWriter writer = mapper. writer()
278+ .withRootName(" centro" ); // Indicamos que se use <centro>, no <Map1>
279+
280+
281+ // Escritura
282+ writer. writeValues(st, centro);
283+
284+ // Lectura (no tiene dificultad)
285+ mapper. readValues(st, Grupo []. class);
286+
236287 Traductores
237288-----------
238289En principio, como en el caso de |JSON | necesitamos el traductor para ``Etapa ``.
@@ -273,7 +324,7 @@ igual que :ref:`la escritura en el caso de JSON <json-jackson-write>`:
273324
274325.. code-block :: java
275326
276- Path archivo = Path . of(System . getProperty(" java.io.tmpdir" ), " claustro .xml" );
327+ Path archivo = Path . of(System . getProperty(" java.io.tmpdir" ), " grupos .xml" );
277328
278329 Grupo [] grupos = new Grupo [] {
279330 new Grupo (1 , Etapa . ESO , ' A' , New Tutor(" Florencio Vázquez Méndez" , " Inglés" ), {
@@ -292,13 +343,12 @@ igual que :ref:`la escritura en el caso de JSON <json-jackson-write>`:
292343
293344 MapperBuilder<?, ?> builder = XmlMapper . builder(factory)
294345 .enable(SerializationFeature . INDENT_OUTPUT )
295- .addMixIn(Claustro . class, ClaustroMixin . class)
296- .addMixIn(Profesor . class, ProfesorMixin . class);
346+ .addMixIn(Grupo . class, GrupoMixin . class);
297347
298348 ObjectMapper mapper = builder. build();
299349
300350 try (OutputStream st = Files . newOutputStream(archivo)) {
301- mapper. writeValue(st, claustro ); // Puede generar JacksonException
351+ mapper. writeValue(st, new GruposWrapper (grupos) ); // Puede generar JacksonException
302352 } catch (JacksonException | IOException err) {
303353 err. printStackTrace();
304354 }
@@ -309,7 +359,7 @@ También podríamos haber generado una cadena con la salida:
309359.. code-block :: java
310360
311361 try {
312- String contenido = mapper. writeValueAsString(claustro );
362+ String contenido = mapper. writeValueAsString(new GruposWrapper (grupos) );
313363 System . out. println(contenido);
314364 } catch (JacksonException err) {
315365 err. printStackTrace();
@@ -332,17 +382,16 @@ lectura del formato es :ref:`prácticamente la misma que para JSON <json-jackson
332382
333383.. code-block :: java
334384
335- Path archivo = Path . of(System . getProperty(" user.home" ), " claustro .xml" );
385+ Path archivo = Path . of(System . getProperty(" user.home" ), " grupos .xml" );
336386
337387 MapperBuilder<?, ?> builder = XmlFactory . builder()
338- .addMixIn(Claustro . class, ClaustroMixin . class)
339- .addMixIn(Profesor . class, ProfesorMixin . class);
388+ .addMixIn(Grupo . class, GrupoMixin . class)
340389
341390 ObjectMapper mapper = builder. build();
342391
343392 try (InputStream st = Files . newInputStream(ruta)) {
344- Claustro claustro = mapper. readValue(st, Claustro . class);
345- System . out. println(claustro );
393+ Grupos [] grupos = mapper. readValue(st, GruposWrapper . class). grupos ;
394+ System . out. println(grupos );
346395 } catch (JacksonIOException | IOException err) {
347396 err. printStackTrace();
348397 }
0 commit comments