将嵌套 XML 转换为 Java 对象的正确方法
Correct way of converting nested XML to Java object
我正在尝试将以下 XML 字符串 (1) 转换为 Java 对象。
我正在尝试按照本教程进行操作:https://www.javatpoint.com/jaxb-unmarshalling-example但无法正确完成。我有 3 个 class 文件:AccountObject (2)、checkingAccts (3)、loanAccts (4)。
需要注意的一点是,所有的值都可以是empty/null,即支票账户列表、贷款账户列表和状态为空。
将此 XML 转换为对象的可接受方法是什么?
(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;
}
}
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;
}
}
正在检查Account.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());
}
}
输出:
解释:
- 我已经改变了你的
account class
。现在它有 CheckingAccount
和 LoanAccount
因为如果你仔细看 XML 你会发现这些是标签。
CheckingAccount
和 LoanAccount
class 有一个 CheckAC
和 LoanAC
的列表,其中还有 acctNbr
、acctStatus
等对应每个class.
我正在尝试将以下 XML 字符串 (1) 转换为 Java 对象。
我正在尝试按照本教程进行操作:https://www.javatpoint.com/jaxb-unmarshalling-example但无法正确完成。我有 3 个 class 文件:AccountObject (2)、checkingAccts (3)、loanAccts (4)。
需要注意的一点是,所有的值都可以是empty/null,即支票账户列表、贷款账户列表和状态为空。
将此 XML 转换为对象的可接受方法是什么?
(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;
}
}
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;
}
}
正在检查Account.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());
}
}
输出:
解释:
- 我已经改变了你的
account class
。现在它有CheckingAccount
和LoanAccount
因为如果你仔细看 XML 你会发现这些是标签。 CheckingAccount
和LoanAccount
class 有一个CheckAC
和LoanAC
的列表,其中还有acctNbr
、acctStatus
等对应每个class.