XStream - Alias ​​de collections implicites

Les alias de collections implicites sont utilisés lorsqu'une collection doit être représentée en XML sans afficher les racines. Par exemple, dans notre cas, nous devons afficher chaque note une par une mais pas dans le nœud racine «notes». Modifions à nouveau notre exemple et ajoutons-y le code suivant.

xstream.addImplicitCollection(Student.class, "notes");

Testons la sérialisation des objets ci-dessus à l'aide de XStream.

Créez un fichier de classe Java nommé XStreamTester dans C:\>XStream_WORKSPACE\com\tutorialspoint\xstream.

Fichier: XStreamTester.java

package com.tutorialspoint.xstream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import java.util.ArrayList;
import java.util.List;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.InputSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {

   public static void main(String args[]) {
   
      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());
      
      xstream.alias("student", Student.class);
      xstream.alias("note", Note.class);
      xstream.aliasField("name", Student.class, "studentName");
      xstream.addImplicitCollection(Student.class, "notes");
      
      Student student = tester.getStudentDetails();
      
      //Object to XML Conversion
      String xml = xstream.toXML(student);
      System.out.println(formatXml(xml));		
   }	

   private Student getStudentDetails() {
      Student student = new Student("Mahesh");
      
      student.addNote(new Note("first","My first assignment."));
      student.addNote(new Note("second","My Second assignment."));
      
      return student;
   }

   public static String formatXml(String xml) {
   
      try {
         Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
         
         serializer.setOutputProperty(OutputKeys.INDENT, "yes");
         serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
         
         Source xmlSource = new SAXSource(new InputSource(
            new ByteArrayInputStream(xml.getBytes())));
         StreamResult res =  new StreamResult(new ByteArrayOutputStream());            
         
         serializer.transform(xmlSource, res);
         
         return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
         
      } catch(Exception e) {
         return xml;
      }
   }
}

class Student {
   private String studentName;
   private List<Note> notes = new ArrayList<Note>();
   
   public Student(String name) {
      this.studentName = name;
   }
   
   public void addNote(Note note) {
      notes.add(note);
   }
   
   public String getName() {
      return studentName;
   }
   
   public List<Note> getNotes() {
      return notes;
   }
}

class Note {
   private String title;
   private String description;
   
   public Note(String title, String description) {
      this.title = title;
      this.description = description;
   }
   
   public String getTitle() {
      return title;
   }
   
   public String getDescription() {
      return description;
   }     
}

Vérifiez le résultat

Compilez les classes en utilisant javac compilateur comme suit -

C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java

Maintenant, lancez XStreamTester pour voir le résultat -

C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester

Vérifiez la sortie comme suit -

<?xml version = "1.0" encoding = "UTF-8"?>
<student>
   <name>Mahesh</name>
   <note>
      <title>first</title>
      <description>My first assignment.</description>
   </note>
   
   <note>
      <title>second</title>
      <description>My Second assignment.</description>
   </note>
</student>

Dans le résultat ci-dessus, nous pouvons voir que ce nom arrive en tant que nœud enfant et nous en avons besoin comme attribut du nœud racine. Pour le remplacer, suivez la section suivante.