Как проанализировать XML с помощью StaxEventItemReader в Spring Batch? - PullRequest
0 голосов
/ 30 октября 2019

Я получаю огромный XML-файл в качестве входных данных для моей пакетной работы. Я пытаюсь использовать StaxEventItemReader, так как это не будет загружать весь XML в память. Я пробовал несколько способов, но XML не анализируется для объекта Java. Каков наилучший подход для преобразования объекта XML в Java в виде кусков?

XML

<?xml version="1.0" encoding="UTF-8"?>
<users>
 <user>
  <attribute name = "userName" rowAction = "ADD" >Jack</attribute>
  <attribute name = "age" rowAction = "DEL">22</attribute>
  <attribute name = "phoneNumber" rowAction = "ADD">111-222-3333</attribute>
 </user>
 <user>
  <attribute name = "userName" rowAction = "DEL" >Ram</attribute>
  <attribute name = "age" rowAction = "DEL">24</attribute>
  <attribute name = "phoneNumber" rowAction = "ADD">111-222-4444</attribute>
 </user>
</users>

Item Reader

    @Bean
public StaxEventItemReader<User> userReader() {
    StaxEventItemReader<User> reader = new StaxEventItemReader<User>();
    reader.setResource(new FileSystemResource(feedFilePath));
    reader.setFragmentRootElementName("user");
    Map<String, Class<?>> aliases = new HashMap<>();
    aliases.put("user", User.class);
    reader.setUnmarshaller(xStreamMarshaller);
    return reader;
    }

Класс пользователя

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

import lombok.ToString;

@XmlRootElement(name = "user")
@ToString
public class User {
    private List<Attribute> attributes;
}
    /**
 * @return the attributes
 */
public List<Attribute> getAttributes() {
    return attributes;
}

/**
 * @param attributes the attributes to set
 */
public void setAttributes(List<Attribute> attributes) {
    this.attributes = attributes;
}
}

Класс атрибутов

import javax.xml.bind.annotation.XmlAttribute;

public class Attribute {
private UserName userName;
private Age age;
private PhoneNumber phoneNumber;
/**
 * @return the userName
 */
public UserName getUserName() {
    return userName;
}
/**
 * @param userName the userName to set
 */
public void setUserName(UserName userName) {
    this.userName = userName;
}
/**
 * @return the age
 */
public Age getAge() {
    return age;
}
/**
 * @param age the age to set
 */
public void setAge(Age age) {
    this.age = age;
}
/**
 * @return the phoneNumber
 */
public PhoneNumber getPhoneNumber() {
    return phoneNumber;
}
/**
 * @param phoneNumber the phoneNumber to set
 */
public void setPhoneNumber(PhoneNumber phoneNumber) {
    this.phoneNumber = phoneNumber;
}

}

Класс UserName

import javax.xml.bind.annotation.XmlAttribute;

public class UserName {

private String value;
private String rowAction;

/**
 * @return the value
 */
@XmlAttribute(name = "userName")
public String getValue() {
    return value;
}

/**
 * @param value the value to set
 */
public void setValue(String value) {
    this.value = value;
}

/**
 * @return the rowAction
 */
@XmlAttribute(name = "rowAction")
public String getRowAction() {
    return rowAction;
}

/**
 * @param rowAction the rowAction to set
 */
public void setRowAction(String rowAction) {
    this.rowAction = rowAction;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...