Search code examples
javaxmlxstream

Is it possible to load data from different xml files into one Java class using XStream?


For instance I have two user accounts: a sender and recipient. Each of them has its own login and password to be used. And these fields are kept in xml config files like this:

<SenderData>
    <login>awesomeLogin</login>
    <password>awesomePass</password>
</SenderData>

In my tests I created Account class and I want to put there either sender or recipient data:

@XStreamAlias("SenderData")
public class Account {
    private String login, password;
}

I load required data from xml using com.thoughtworks.xstream @XStream and its alias, annotating the class with @XStreamAlias("SenderData") annotation.

It works perfectly for one specific xml source file, but if I have several xml sources (sender and recipient here) how can I load appropriate data using @XStream? To be clear, my goal is to have two objects of one Account class, something like this:

Account sender = myXstream.load("SenderData", Account.class); //works!
Account recipient = myXstream.load("RecipientData", Account.class);//doesn't work

- the last will not work as I can put only one @XStreamAlias("SenderData") annotation to Account class


Solution

  • Assuming you have to load thoses XML, and using xstream-distribution-1.4.9

    1.first xml (recipient.xml)

    <RecipientData>
        <login>naLogin</login>
        <password>anaPass</password>
    </RecipientData>
    

    2. second XML (sender.xml)

    <SenderData>
        <login>awesomeLogin</login>
        <password>awesomePass</password>
    </SenderData>
    

    With this Account class :

    import com.thoughtworks.xstream.annotations.XStreamAlias;
    
    @XStreamAlias("SenderData")
    public class Account {
        private String login, password;
    
        public String getLogin() {
            return login;
        }
    
        /*public void setLogin(String login) {
            this.login = login;
        }*/
    
        public String getPassword() {
            return password;
        }
    
        /*public void setPassword(String password) {
            this.password = password;
        }*/
    
    
        public void toPtring(){
            System.out.println("login="+this.getLogin());
            System.out.println("pass="+this.getPassword());
        }
    }
    

    and test class :

    public class maintest {
    
    
        public static void main(String args[]) throws FileNotFoundException{
    
            XStream xstream = new XStream(); 
            xstream.alias("SenderData", Account.class);
            FileReader r = new FileReader("sender.xml");
            Account sender=(Account)xstream.fromXML(r);     
            sender.toPtring();
    
    
            xstream.alias("RecipientData", Account.class);
            FileReader r2 = new FileReader("recipient.xml");
            Account recipient=(Account)xstream.fromXML(r2);
            recipient.toPtring();
    
    
        }
    }
    

    its works. like this result

    login=awesomeLogin
    pass=awesomePass
    login=naLogin
    pass=anaPass
    

    Look at you code to see if you didn't forget something