vishalkohli
vishalkohli

Reputation: 97

Correct way of converting nested XML to Java object

I am trying to convert the following XML string (1) to a Java Object.

I am trying to follow this tutorial : https://www.javatpoint.com/jaxb-unmarshalling-example but not able to do it correctly. I have 3 class files : AccountObject (2), checkingAccts (3), loanAccts (4).

One point to be noted is that all of the values can be empty/null i.e. checking account list, loan account list and status empty.

What is the acceptable method of converting this XML into the object?

(1)

<AccountObject xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <categories
        xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:string>category</a:string>
        <a:string>category</a:string>
    </categories>
    <checkingAccts>
        <CheckingAccts>
            <acctNbr>1111</acctNbr>
            <acctStatus>0</acctStatus>
            <availBalance>14299.49</availBalance>
            <balance>14294.49</balance>
            <dateOpened>2017-09-07</dateOpened>
            <type>4020</type>
        </CheckingAccts>
        <CheckingAccts>
            <acctNbr>2222</acctNbr>
            <acctStatus>0</acctStatus>
            <availBalance>470.72</availBalance>
            <balance>465.72</balance>
            <dateOpened>2017-09-18</dateOpened>
            <type>4020</type>
        </CheckingAccts>
        <CheckingAccts>
            <acctNbr>4444</acctNbr>
            <acctStatus>0</acctStatus>
            <availBalance>5.00</availBalance>
            <balance>0.00</balance>
            <dateOpened>2018-04-26</dateOpened>
            <type>4200</type>
        </CheckingAccts>
    </checkingAccts>
    <loanAccts>
        <LoanAccts>
            <acctNbr>1111</acctNbr>
            <acctStatus>0</acctStatus>
            <availBalance>25000.00</availBalance>
            <balance>1100.03</balance>
            <dateOpened>2017-10-13</dateOpened>
            <type>6190</type>
        </LoanAccts>
        <LoanAccts>
            <acctNbr>2222</acctNbr>
            <acctStatus>0</acctStatus>
            <availBalance>87777.00</availBalance>
            <balance>0.00</balance>
            <dateOpened>2018-04-26</dateOpened>
            <type>6160</type>
        </LoanAccts>
    </loanAccts>
    <statusMessage>THIS IS A TEST MESSAGE</statusMessage>
</AccountObject>

(2)

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "AccountObject")
public class AccountObject {

    private String statusMessage;
    private List<CheckingAccts> checkingAccounts;
    private List<LoanAccts> loanAccounts;   


    public List<LoanAccts> getLoanAccounts() {
        return loanAccounts;
    }

    public void setLoaanAccounts(List<LoanAccts> loaanAccounts) {
        this.loanAccounts = loaanAccounts;
    }

    public String getStatusMessage() {
        return statusMessage;
    }

    public void setStatusMessage(String statusMessage) {
        this.statusMessage = statusMessage;
    }


    public List<CheckingAccts> getCheckingAccounts() {
        return checkingAccounts;
    }

    public void setCheckingAccounts(List<CheckingAccts> checkingAccounts) {
        this.checkingAccounts = checkingAccounts;
    }

}

(3)

public class CheckingAccts {

    protected String acctNbr;
    protected String acctStatus;
    protected String availBalance;
    protected String balance;
    protected String dateOpened;
    protected String type;

    public String getAcctNbr() {
        return acctNbr;
    }

    public void setAcctNbr(String acctNbr) {
        this.acctNbr = acctNbr;
    }

    public String getDateOpened() {
        return dateOpened;
    }

    public void setDateOpened(String dateOpened) {
        this.dateOpened = dateOpened;
    }

    public String getAcctStatus() {
        return acctStatus;
    }

    public void setAcctStatus(String acctStatus) {
        this.acctStatus = acctStatus;
    }

    public String getBalance() {
        return balance;
    }

    public void setBalance(String balance) {
        this.balance = balance;
    }

    public String getAvailBalance() {
        return availBalance;
    }

    public void setAvailBalance(String availBalance) {
        this.availBalance = availBalance;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

(4)

public class LoanAccts {

    protected String acctNbr;
    protected String acctStatus;
    protected String availBalance;
    protected String balance;
    protected String dateOpened;
    protected String type;


    public String getAcctNbr() {
        return acctNbr;
    }

    public void setAcctNbr(String acctNbr) {
        this.acctNbr = acctNbr;
    }

    public String getAcctStatus() {
        return acctStatus;
    }

    public void setAcctStatus(String acctStatus) {
        this.acctStatus = acctStatus;
    }

    public String getBalance() {
        return balance;
    }

    public void setBalance(String balance) {
        this.balance = balance;
    }

    public String getAvailBalance() {
        return availBalance;
    }

    public void setAvailBalance(String availBalance) {
        this.availBalance = availBalance;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDateOpened() {
        return dateOpened;
    }

    public void setDateOpened(String dateOpened) {
        this.dateOpened = dateOpened;
    }

}

Upvotes: 0

Views: 2503

Answers (1)

Nitin Bisht
Nitin Bisht

Reputation: 5351

Account.java:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "AccountObject")
public class Account {

    private String statusMessage;
    private CheckingAccount checkingAccts;
    private LoanAccount loanAccts;

    public Account() {}

    public Account(String statusMessage, CheckingAccount checkingAccts, LoanAccount loanAccts) {
        super();
        this.statusMessage = statusMessage;
        this.checkingAccts = checkingAccts;
        this.loanAccts = loanAccts;
    }

    @XmlElement(name="statusMessage")
    public String getStatusMessage() {
        return statusMessage;
    }

    public void setStatusMessage(String statusMessage) {
        this.statusMessage = statusMessage;
    }

    @XmlElement(name="checkingAccts")
    public CheckingAccount getCheckingAccts() {
        return checkingAccts;
    }

    public void setCheckingAccts(CheckingAccount checkingAccts) {
        this.checkingAccts = checkingAccts;
    }

    @XmlElement(name="loanAccts")
    public LoanAccount getLoanAccts() {
        return loanAccts;
    }

    public void setLoanAccts(LoanAccount loanAccts) {
        this.loanAccts = loanAccts;
    }

}

CheckingAccount.java:

import javax.xml.bind.annotation.XmlElement;

public class CheckingAccount {

    private List<CheckAC> checkingAcctsList;

    public CheckingAccount() {}

    public CheckingAccount(List<CheckAC> checkingAcctsList) {
        super();
        this.checkingAcctsList = checkingAcctsList;
    }

    @XmlElement(name="CheckingAccts")
    public List<CheckAC> getCheckingAcctsList() {
        return checkingAcctsList;
    }

    public void setCheckingAcctsList(List<CheckAC> checkingAcctsList) {
        this.checkingAcctsList = checkingAcctsList;
    }

}

CheckAC.java:

public class CheckAC {

    protected String acctNbr;
    protected String acctStatus;
    protected String availBalance;
    protected String balance;
    protected String dateOpened;
    protected String type;

    public CheckAC() {}

    public CheckAC(String acctNbr, String acctStatus, String availBalance, String balance, String dateOpened,
            String type) {
        super();
        this.acctNbr = acctNbr;
        this.acctStatus = acctStatus;
        this.availBalance = availBalance;
        this.balance = balance;
        this.dateOpened = dateOpened;
        this.type = type;
    }

    @XmlElement(name="acctNbr")
    public String getAcctNbr() {
        return acctNbr;
    }

    public void setAcctNbr(String acctNbr) {
        this.acctNbr = acctNbr;
    }

    @XmlElement(name="dateOpened")
    public String getDateOpened() {
        return dateOpened;
    }

    public void setDateOpened(String dateOpened) {
        this.dateOpened = dateOpened;
    }

    @XmlElement(name="acctStatus")
    public String getAcctStatus() {
        return acctStatus;
    }

    public void setAcctStatus(String acctStatus) {
        this.acctStatus = acctStatus;
    }

    @XmlElement(name="balance")
    public String getBalance() {
        return balance;
    }

    public void setBalance(String balance) {
        this.balance = balance;
    }

    @XmlElement(name="availBalance")
    public String getAvailBalance() {
        return availBalance;
    }

    public void setAvailBalance(String availBalance) {
        this.availBalance = availBalance;
    }

    @XmlElement(name="type")
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

Main.java:

public class Main {

    public static void main(String[] args) throws JAXBException {

        File file = new File("etc/question.xml");  
        JAXBContext jaxbContext = JAXBContext.newInstance(Account.class);  

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  
        Account acc = (Account) jaxbUnmarshaller.unmarshal(file); 

        // List of checking accounts
        List<CheckAC> checkingACList = acc.getCheckingAccts().getCheckingAcctsList();
        for(CheckAC checkAC : checkingACList)  
            System.out.println("A/C No: " + checkAC.getAcctNbr() + " ,A/C Status: " 
                    + checkAC.getAcctStatus() + " ,Available Balance: " + checkAC.getAvailBalance() + " ,Date Opened: " + checkAC.getDateOpened()
                    + " ,Type: " + checkAC.getType() + " ,Balance: " + checkAC.getBalance());  

    }
}

Output:

enter image description here

Explanation:

  1. I have changed your account class. Now it has CheckingAccount and LoanAccount because if you look XML closely then you will find these are tags.
  2. CheckingAccount and LoanAccount classes have a list of CheckAC and LoanAC which further have tags such as acctNbr, acctStatus etc corresponding to each class.

Upvotes: 2

Related Questions