Using Converter
Let us use a SingleValueConvertor whose purpose is to convert an object into a single string. We will use SingleValueConvertor to write an object as attribute string.Create a Converter
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); } }
Register a Converter
xstream.registerConverter(new NameConverter());
Example without Converter
Let us first test the code without converter in XStream.Create a java class file named XStreamTester in C:\>XStream_WORKSPACE\com\tutorialspoint\xstream.
File: 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; } }Verify the Result
Compile the classes using javac compiler as follows:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.javaNow run the XStreamTester to see the result:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTesterVerify the output as follows:
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</name>
</student>
Example with Converter
Let us now test the code with converter in XStream.Create a java class file named XStreamTester in C:\>XStream_WORKSPACE\com\tutorialspoint\xstream.
File: 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); } }Verify the Result
Compile the classes using javac compiler as follows:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.javaNow run the XStreamTester to see the result:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTesterVerify the output as follows:
<?xml version="1.0" encoding="UTF-8"?> <student name="Mahesh,Parashar"/>Custom Converter
No comments:
Post a Comment