Wednesday, January 28, 2015

Generate XStream Classes

While dealing with XStream if you had to create mapper classes and write a parser you would want use a shortcut for solution.

For the next time i will follow the below path

1) Create xsd file for the given xml using IntelliJ Idea













2) Create Jaxb  classes for the generated xsd file : http://goo.gl/uOjSAz

3) in the generated you need to put add : @XStreamAlias( "xml_tag_name_for_classs" ) for each class or attribute when you see the @XmlRootElement(name = "xml_tag_name_for_the _item_or_class")
 this will remove all undefined field exceptions of the XStream
If you get duplicate field exception add the @XStreamImplicit for the related field in the class
(I use copy paste for this job and if you have selected the third item in the first step you will have only one java file and replacing annotations will be easier. I have tried the other 2 options too for you)

4) in the parser class you need to xstream.processAnnotations(Your_class_name.class); Otherwise XStream will not recognize your annotations..Somethings are stupid still waits commands to do its work :/


In the end Parser class will be something like below

public class DataSharingParser {

    public static void main(String[] args) {
        try {
            XStream xstream = new XStream(new DomDriver());
            //xstream.autodetectAnnotations(true);

            xstream.processAnnotations(Root.class);
            xstream.processAnnotations(Root.Data.class);
            xstream.processAnnotations(Root.Error.class);
            xstream.processAnnotations(Root.Header.class);
            xstream.processAnnotations(Root.Data.CustomerDataShareOptionList.class);
            xstream.processAnnotations(Root.Data.CustomerDataShareOptionList.SharingPercentageList.class);
            xstream.processAnnotations(Root.Data.CustomerDataShareOptionList.DataShareOptionList.class);
            xstream.processAnnotations(Root.Data.CustomerDataShareOptionList.DataShareOptionList.SubscriptionList.class);
            xstream.processAnnotations(Root.Error.MsgList.class);
            xstream.processAnnotations(Root.Error.MsgList.Msg.class);
            xstream.processAnnotations(Root.Error.MsgList.Msg.Valuelist.class);

            Path  xmlPath = Paths.get("C:\\somewhere_in_there\\src", "your_lovely.xml");
            byte[] wikiArray = Files.readAllBytes(xmlPath);
            String asString = new String(wikiArray, "UTF-8");
            Root root = (Root) xstream.fromXML(asString);

            Root.Data data = root.getData();

...more parsing sources goes below...

        } catch (IOException e) {
            System.out.println(e);
        }

        System.exit(0);

    }
}

Note: You may not trust the xstream.autodetectAnnotations(true); while using XStream-1.4.7 and java 1.7