Преобразователи XStream являются ключевыми компонентами библиотеки XStream, которые отвечают за преобразование объекта в XML и наоборот. XStream предоставляет многочисленные конвертеры для распространенных типов, таких как примитивы, строки, файлы, коллекции, массивы и даты.
Использование конвертера
Давайте используем SingleValueConvertor, целью которого является преобразование объекта в одну строку. Мы будем использовать SingleValueConvertor для записи объекта в виде строки атрибута.
Создать конвертер
class NameConverter implements SingleValueConverter { public Object fromString(String name) { String[] nameparts = name.split(","); return new Name(nameparts[0], nameparts[1]); } public String toString(Object name) { return ((Name)name).getFirstName() + "," + ((Name)name).getLastName(); } public boolean canConvert(Class type) { return type.equals(Name.class); } }
Зарегистрировать конвертер
xstream.registerConverter(new NameConverter());
Пример без конвертера
Давайте сначала проверим код без конвертера в XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; 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.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; 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()); Student student = tester.getStudentDetails(); xstream.autodetectAnnotations(true); //Object to XML Conversion String xml = xstream.toXML(student); System.out.println(formatXml(xml)); } private Student getStudentDetails() { Student student = new Student("Mahesh","Parashar"); 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; } } } @XStreamAlias("student") class Student { @XStreamAlias("name") @XStreamAsAttribute private Name studentName; public Student(String firstName, String lastName) { this.studentName = new Name(firstName, lastName); } public Name getName() { return studentName; } } class Name { private String firstName; private String lastName; public Name(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } }
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
<?xml version = "1.0" encoding = "UTF-8"?> <student> <name> <firstName>Mahesh</firstName> <lastName>Parashar</lastName> </name> </student>
Пример с конвертером
Теперь давайте проверим код с конвертером в XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; 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.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.converters.SingleValueConverter; 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()); Student student = tester.getStudentDetails(); xstream.autodetectAnnotations(true); xstream.registerConverter(new NameConverter()); //Object to XML Conversion String xml = xstream.toXML(student); System.out.println(formatXml(xml)); } private Student getStudentDetails() { Student student = new Student("Mahesh","Parashar"); 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; } } } @XStreamAlias("student") class Student { @XStreamAlias("name") @XStreamAsAttribute private Name studentName; public Student(String firstName, String lastName) { this.studentName = new Name(firstName, lastName); } public Name getName() { return studentName; } } class Name { private String firstName; private String lastName; public Name(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } } class NameConverter implements SingleValueConverter { public Object fromString(String name) { String[] nameparts = name.split(","); return new Name(nameparts[0], nameparts[1]); } public String toString(Object name) { return ((Name)name).getFirstName() + "," + ((Name)name).getLastName(); } public boolean canConvert(Class type) { return type.equals(Name.class); } }
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
<?xml version = "1.0" encoding = "UTF-8"?> <student name = "Mahesh,Parashar"/>