Я хочу вернуть новый XML-файл с проверенным списком на основе исходного XML-файла. Как правильно переписать имена деталей для списка аккаунтов с помощью Jackson xmlMapper?
Я хочу прочитать значения из XML-файла (сведения об учетных записях) и преобразовать его в объекты Java. Мне нужно сгруппировать эти отдельные аккаунты в список. Затем я проверяю эти учетные записи, используя некоторые средства проверки, и затем мне нужно вернуть проверенный список учетных записей в новый XML-файл.
Имя "LinkedList" показывает, потому что я использую его в классе обслуживания, чтобы переписать список.
Я даю вам свой код ниже.
Может кто-нибудь может мне помочь?
Спасибо!
Исходный XML-файл:
<accounts>
<account iban="PL61109010140000071219812875">
<name>name1</name>
<currency>PLN</currency>
<balance>123.45</balance>
<closingDate>2031-06-10</closingDate>
</account>
<account iban="PL61109010140000071219812871">
<name>name2</name>
<currency>PLN</currency>
<balance>85.00</balance>
<closingDate>2035-10-01</closingDate>
</account>
</accounts>
PARSER:
public class Parser {
private ObjectMapper objectMapper;
public Parser() {
this.objectMapper = new XmlMapper();
}
public AccountList readFromXML() throws IOException {
return objectMapper.readValue(
readTextFromFile(), AccountList.class);
}
public void writeToXML(List<Account> account) throws IOException, XMLStreamException {
StringWriter stringWriter = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
XMLStreamWriter sw = xmlOutputFactory.createXMLStreamWriter(stringWriter);
XmlMapper mapper = new XmlMapper();
objectMapper.writeValue(new
File("src/main/resources/SortedData.xml"), account);
sw.writeStartDocument();
}
private String readTextFromFile() throws IOException {
InputStream in = new FileInputStream("src/main/resources/SourceData.xml");
BufferedReader buff = new BufferedReader(new InputStreamReader(in));
String line = buff.readLine();
StringBuilder builder = new StringBuilder();
while(line != null){
builder.append(line).append("\n");
line = buff.readLine(); }
return builder.toString();
}
}
Класс учетной записи:
public final class Account implements Serializable {
private static final long serialVersionUID = -4816735989159211337L;
@JacksonXmlProperty(localName = "iban", isAttribute = true)
private String accountIban;
@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "currency")
private String currency;
@JacksonXmlProperty(localName = "balance")
private BigDecimal balance;
@JacksonXmlProperty(localName = "closingDate")
private String closingDate;
public Account() {
}
public Account(String accountIban, String name, String currency, BigDecimal balance, String closingDate) {
this.accountIban = accountIban;
this.name = name;
this.currency = currency;
this.balance = balance;
this.closingDate = closingDate;
}
(I HAVE BASIC GETTERS AND SETTERS IN THS PLACE, BUT I DIDN'T PASE IT)
@Override
public String toString() {
return "Account{" +
"accountNumber='" + accountIban + '\'' +
", name='" + name + '\'' +
", currency='" + currency + '\'' +
", balance=" + balance +
", closingDate=" + closingDate +
'}';
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Account account = (Account) o;
return Objects.equals(accountIban, account.accountIban) &&
Objects.equals(name, account.name) &&
Objects.equals(currency, account.currency) &&
Objects.equals(balance, account.balance) &&
Objects.equals(closingDate, account.closingDate);
}
}
СПИСОК СЧЕТОВ:
@JacksonXmlRootElement(localName = "accounts")
@XmlAccessorType(XmlAccessType.FIELD)
public final class AccountList implements Serializable {
private static final long serialVersionUID = 9215731280802778862L;
@JacksonXmlElementWrapper(localName = "accountList", useWrapping = false)
private List<Account> accountList;
public AccountList() {
}
GETTERS AND SETTERS IN THIS PLACE
@Override
public String toString() {
return "Employees{" +
"employees=" + accountList.toString() +
'}';
}
}
КЛАСС ОБСЛУЖИВАНИЯ:
private AccountValidatorsImpl validators;
public AccountServiceImpl() {
this.validators = new AccountValidatorsImpl();
}
@Override
public List<Account> validateEverySingleAccount(List<Account> sourceAccountList) {
List<Account> validatedList = new LinkedList<>();
for (Account account: sourceAccountList) {
if(validators.checkAllValidators(account))
validatedList.add(account);
}
return validatedList;
}
@Override
public List<Account> sortValidatedAccountList(List<Account> validatedAccountList){
List<Account> sortedList = new LinkedList<>(validatedAccountList);
Comparator<Account> comparator = (o1, o2) -> o1.getName().compareTo(o2.getName());
sortedList.sort(comparator);
return sortedList;
}
}
ГЛАВНЫЙ КЛАСС:
public static void main(String[] args) throws IOException, XMLStreamException {
Parser parser = new Parser();
AccountServiceImpl service = new AccountServiceImpl();
AccountList list = parser.readFromXML();
List<Account> listOfAccounts = list.getAccountList();
List<Account> listOfValidatedAccounts = service.validateEverySingleAccount(listOfAccounts);
List<Account> listOfSortedAccounts = service.sortValidatedAccountList(listOfValidatedAccounts);
parser.writeToXML(listOfSortedAccounts);
OBJECT SERVICE IS CLASS WHERE I DO VALIDATION. IF IT WILL BE NESSECERY I WILL PASTE IT
ЗАКЛЮЧИТЕЛЬНЫЙ ГЕНЕРАЛЬНЫЙ ФАЙЛ XML:
<LinkedList>
<item iban="PL61109010140000071219812875">
<name>name1</name>
<currency>PLN</currency>
<balance>123.45</balance>
<closingDate>2031-06-10</closingDate>
</item>
<item iban="PL61109010140000071219812871">
<name>name2</name>
<currency>PLN</currency>
<balance>85.00</balance>
<closingDate>2035-10-01</closingDate>
</item>
</LinkedList>
К сожалению, во время обработки программа пропускает имена, это: теряет , возвращает и и дает . Мне нужны одинаковые имена для значений.