簡體   English   中英

如何使用 JAXB 在 Java 中將 CSV 轉換為 XML

[英]How to convert CSV to XML in Java using JAXB

我正在嘗試使用 apache camel 使用 CSV 文件並將每一行轉換為 XML 並將每個 xml 發布到 solace 主題。 XML 格式很復雜,我不確定如何在 Java 中創建如此復雜的 XML。 CSV 包含員工有效負載字段。 XML 的其他部分包括 header、auditRecords 和 ancillaryData 是硬編碼/靜態數據(時間戳可以是當前日期)。

如何使用 JAXB 在 Java 中將 CSV 轉換為 XML?

<canonMessage xmlns="http://www.test.com/canon/v1">
   <header>
      <metadata>
         <domain>
            <name>party</name>
            <schemaVersion>1.0</schemaVersion>
            <subdomain>
               <name>employee</name>
            </subdomain>
         </domain>
         <identifier>
            <id idScheme="HR/lanId">kabcde</id>
         </identifier>
         <source>HR</source>
         <messageId>352247</messageId>
         <version>v1234520171106</version>
      </metadata>
   </header>
   <payload>
      <employee xmlns="http://www.testcompany.com/party/employee/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.testcompany.com/party/employee/v1 employee-v1.xsd">
         <employeeId>a</employeeId>
         <lanId>a</lanId>
         <name>
            <lastName>a</lastName>
            <firstName>a</firstName>
         </name>
         <businessTitle>String</businessTitle>
         <status>String</status>
         <legalEntity>String</legalEntity>
         <groupName>String</groupName>
         <divisionName>String</divisionName>
         <departmentName>String</departmentName>
         <costCentre>String</costCentre>
         <officeLocation>String</officeLocation>
         <region>String</region>
         <citizenship>
            <citizenshipCountry>String</citizenshipCountry>
            <citizenshipCountry>String</citizenshipCountry>
         </citizenship>
      </employee>
   </payload>
   <auditRecords>
      <sourceAuditRecord>
         <system>PeopleSoftHR</system>
         <user />
         <timestamp>
            <created>2016-09-29T09:41:54.436+08:00</created>
            <updated>2016-09-29T09:41:54.436+08:00</updated>
            <sent>2016-09-29T09:42:48.366+08:00</sent>
         </timestamp>
      </sourceAuditRecord>
      <auditRecord>
         <system>listener-settlement</system>
         <timestamp>
            <received>2016-09-29T11:44:56.306+10:00</received>
         </timestamp>
      </auditRecord>
   </auditRecords>
   <ancillaryData>
      <dataClassification xmlns="http://www.test.com/data-classification/v1">
         <compartments>
            <compartment name="domain">employee</compartment>
            <compartment name="confidentiality">confidential</compartment>
         </compartments>
      </dataClassification>
   </ancillaryData>
   <trailer>
      <checksum type="sha-256">df29183132b0733e5afbe5a9ab44f74ee7b43fff4d48daa</checksum>
   </trailer>
</canonMessage>

員工等級:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@CsvRecord(separator = ",")
public class Employee {

    @DataField(pos = 1)
    @XmlElement
    public String employeeId;
    
    @DataField(pos = 2)
    @XmlElement
    public String lanId;
    
    @DataField(pos = 3)
    @XmlElement
    public String status;
    
    @DataField(pos = 4)
    @XmlElement
    public String costCentre;

    @DataField(pos = 5)
    @XmlElement
    public String groupName;
    
    @DataField(pos = 6)
    @XmlElement
    public String divisionName;
    
    @DataField(pos = 7)
    @XmlElement
    public String departmentName;

    @DataField(pos = 8)
    @XmlElement
    public String region;

    @DataField(pos = 9)
    @XmlElement
    public String businessTitle;

    @DataField(pos = 10)
    @XmlElement
    public String officeLocation;
    
    @DataField(pos = 11)
    @XmlElement
    public String legalEntity;

    @DataField(pos = 12)
    @XmlElement
    public String birthDate;
    
    @DataField(pos = 13)
    @XmlElement
    public String firstName;
    
    @DataField(pos = 14)
    @XmlElement
    public String lastName;

    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }

    public String getLanId() {
        return lanId;
    }

    public void setLanId(String lanId) {
        this.lanId = lanId;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCostCentre() {
        return costCentre;
    }

    public void setCostCentre(String costCentre) {
        this.costCentre = costCentre;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public String getDivisionName() {
        return divisionName;
    }

    public void setDivisionName(String divisionName) {
        this.divisionName = divisionName;
    }

    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getBusinessTitle() {
        return businessTitle;
    }

    public void setBusinessTitle(String businessTitle) {
        this.businessTitle = businessTitle;
    }

    public String getOfficeLocation() {
        return officeLocation;
    }

    public void setOfficeLocation(String officeLocation) {
        this.officeLocation = officeLocation;
    }

    public String getLegalEntity() {
        return legalEntity;
    }

    public void setLegalEntity(String legalEntity) {
        this.legalEntity = legalEntity;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
            
}

標題類:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="metadata")
@XmlAccessorType(XmlAccessType.FIELD)
public class Header {

    @XmlElementWrapper(name = "domain")
    private List<Domain> domain;
    
    private String id;
    
    private String source;
    
    private String messageId;
    
    private String version;

    public List<Domain> getDomain() {
        return domain;
    }

    public void setDomain(List<Domain> domain) {
        this.domain = domain;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
    
    public Header() {
        
    }
    
    public Header(List<Domain> domain, String id, String source, String messageId, String version) {
        this.domain = domain;
        this.id = id;
        this.source = source;
        this.messageId = messageId;
        this.version = version;
    }
}

域類:

@XmlRootElement(name="domain")
@XmlAccessorType(XmlAccessType.FIELD)
public class Domain {

    private String name;
    
    private String schemaVersion;
    
    //@XmlElementWrapper(name = "subdomain")
    private String subdomain;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSchemaVersion() {
        return schemaVersion;
    }
    public void setSchemaVersion(String schemaVersion) {
        this.schemaVersion = schemaVersion;
    }
    public String getSubdomain() {
        return subdomain;
    }
    public void setSubdomain(String subdomain) {
        this.subdomain = subdomain;
    }
    
    public Domain() {
        
    }
    
    public Domain(String name, String schemaVersion, String subdomain) {
        this.name = name;
        this.schemaVersion = schemaVersion;
        this.subdomain = subdomain;
    }
}

服務:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.springframework.stereotype.Service;


@Service
public class HrCanonicalService {

    private final String BOOKSTORE_XML = "app/hrci-files/bookstore-jaxb.xml";
    public void process(Employee employee) {
        
        JAXBContext context;
        try {
            context = JAXBContext.newInstance(CanonMessage.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

            // Write to System.out
            m.marshal(employee, System.out);

            // Write to File
            m.marshal(employee, new File(BOOKSTORE_XML));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        
    }
}

我設法根據上述 XML 模式創建了 XML。 我跳過了 ancillaryData 和 auditRecord 元素,因為它不是強制性的。 讓我知道這是否是形成 XML 的正確方法。

CanonMessage.java

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="canonMessage")
@XmlAccessorType(XmlAccessType.FIELD)
public class CanonMessage {

    @XmlElementWrapper(name = "header")
    @XmlElement(name = "metadata")
    private List<Header> metadata;
    
    @XmlElementWrapper(name = "payload")
    @XmlElement(name = "employee")
    private List<Employee> employee;

    @XmlElementWrapper(name = "auditRecords")
    @XmlElement(name = "sourceAuditRecord")
    private List<SourceAuditRecord> sourceAuditRecord;
    
    @XmlElementWrapper(name = "trailer")
    @XmlElement(name = "checksum")
    private List<Trailer> trailer;
    
    public List<Header> getMetadata() {
        return metadata;
    }

    public void setMetadata(List<Header> metadata) {
        this.metadata = metadata;
    }
        
    public List<Employee> getEmployee() {
        return employee;
    }

    public void setEmployee(List<Employee> employee) {
        this.employee = employee;
    }

    public List<SourceAuditRecord> getSourceAuditRecord() {
        return sourceAuditRecord;
    }

    public void setSourceAuditRecord(List<SourceAuditRecord> sourceAuditRecord) {
        this.sourceAuditRecord = sourceAuditRecord;
    }

    public List<Trailer> getTrailer() {
        return trailer;
    }

    public void setTrailer(List<Trailer> trailer) {
        this.trailer = trailer;
    }

}

頭文件

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="metadata")
@XmlAccessorType(XmlAccessType.FIELD)
public class Header {

    private List<Domain> domain;
    
    @XmlElementWrapper(name = "identifier")
    @XmlElement(name = "id")
    private List<Identifier> identifier;
    
    private String source;
    
    private String messageId;
    
    public List<Domain> getDomain() {
        return domain;
    }

    public void setDomain(List<Domain> domain) {
        this.domain = domain;
    }

    public List<Identifier> getIdentifier() {
        return identifier;
    }

    public void setIdentifier(List<Identifier> identifier) {
        this.identifier = identifier;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }
    
    public Header() {
        
    }
    
    public Header(List<Domain> domain, List<Identifier> identifier, String source, String messageId) {
        this.domain = domain;
        this.identifier = identifier;
        this.source = source;
        this.messageId = messageId;
        
    }
}

標識符.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name = "id")
@XmlAccessorType(XmlAccessType.FIELD)
public class Identifier {

    @XmlAttribute(name = "idScheme")
    private String id;

    @XmlValue
    private String Value;
    
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getValue() {
        return Value;
    }

    public void setValue(String value) {
        Value = value;
    }

}

域名.java

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="domain")
@XmlAccessorType(XmlAccessType.FIELD)
public class Domain {

    @XmlElement
    private String name;
    
    @XmlElement
    private String schemaVersion;
    
    @XmlElementWrapper(name = "subdomain")
    @XmlElement(name = "name")
    private List<String> subdomain;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSchemaVersion() {
        return schemaVersion;
    }
    public void setSchemaVersion(String schemaVersion) {
        this.schemaVersion = schemaVersion;
    }
    public List<String> getSubdomain() {
        return subdomain;
    }
    public void setSubdomain(List<String> subdomain) {
        this.subdomain = subdomain;
    }
    
    public Domain() {
        
    }
    
    public Domain(String name, String schemaVersion, List<String> subdomain) {
        this.name = name;
        this.schemaVersion = schemaVersion;
        this.subdomain = subdomain;
    }
}

雇員.java

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

import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
import org.apache.camel.dataformat.bindy.annotation.DataField;


@XmlRootElement(namespace = Constants.EMPLOYEE_NAMESPACE)
@XmlAccessorType(XmlAccessType.FIELD)
@CsvRecord(separator = ",")
public class Employee {

    @DataField(pos = 1)
    @XmlElement
    private String employeeId;
    
    @DataField(pos = 2)
    @XmlElement
    private String lanId;
    
    @DataField(pos = 3)
    @XmlElement
    private String status;
    
    @DataField(pos = 4)
    @XmlElement
    private String costCentre;

    @DataField(pos = 5)
    @XmlElement
    private String groupName;
    
    @DataField(pos = 6)
    @XmlElement
    private String divisionName;
    
    @DataField(pos = 7)
    @XmlElement
    private String departmentName;

    @DataField(pos = 8)
    @XmlElement
    private String region;

    @DataField(pos = 9)
    @XmlElement
    private String businessTitle;

    @DataField(pos = 10)
    @XmlElement
    private String officeLocation;
    
    @DataField(pos = 11)
    @XmlElement
    private String legalEntity;

    @DataField(pos = 12)
    @XmlElement
    private String birthDate;
    
    @XmlElement
    private Name name;
    
    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }

    public String getLanId() {
        return lanId;
    }

    public void setLanId(String lanId) {
        this.lanId = lanId;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCostCentre() {
        return costCentre;
    }

    public void setCostCentre(String costCentre) {
        this.costCentre = costCentre;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public String getDivisionName() {
        return divisionName;
    }

    public void setDivisionName(String divisionName) {
        this.divisionName = divisionName;
    }

    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public String getBusinessTitle() {
        return businessTitle;
    }

    public void setBusinessTitle(String businessTitle) {
        this.businessTitle = businessTitle;
    }

    public String getOfficeLocation() {
        return officeLocation;
    }

    public void setOfficeLocation(String officeLocation) {
        this.officeLocation = officeLocation;
    }

    public String getLegalEntity() {
        return legalEntity;
    }

    public void setLegalEntity(String legalEntity) {
        this.legalEntity = legalEntity;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

    public Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }
}

SourceAuditRecord.java

import java.util.List;

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

@XmlRootElement(name="sourceAuditRecord")
@XmlAccessorType(XmlAccessType.FIELD)
public class SourceAuditRecord {

    @XmlElement
    private String system;
    
    @XmlElement
    private List<Timestamp> timestamp;
    
    public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }

    public List<Timestamp> getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(List<Timestamp> timestamp) {
        this.timestamp = timestamp;
    }
}

時間戳.java

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

@XmlRootElement(name="timestamp")
@XmlAccessorType(XmlAccessType.FIELD)
public class Timestamp {

    @XmlElement
    private String created;
        
    @XmlElement
    private String updated;
        
    @XmlElement
    private String sent;

    public String getCreated() {
        return created;
    }

    public void setCreated(String created) {
        this.created = created;
    }

    public String getUpdated() {
        return updated;
    }

    public void setUpdated(String updated) {
        this.updated = updated;
    }

    public String getSent() {
        return sent;
    }

    public void setSent(String sent) {
        this.sent = sent;
    }   
}

預告片.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name = "checksum")
@XmlAccessorType(XmlAccessType.FIELD)
public class Trailer {

    @XmlAttribute(name = "type")
    private String checksum;

    @XmlValue
    private String Value;
    
    public String getChecksum() {
        return checksum;
    }

    public void setChecksum(String checksum) {
        this.checksum = checksum;
    }
    

    public String getValue() {
        return Value;
    }

    public void setValue(String value) {
        Value = value;
    }
}

常量.java

public class Constants {

    public static final String SHA_256_HEX = "sha-256";
    public static final String HRCANONICAL_XML = "app/hrci-files/SampleEmployee_V1_20201103.xml";
    public static final String EMPLOYEE_NAMESPACE = "http://www.xxxx/party/employee/v1";
    public static final String HEADER_DOMAIN_NAME = "party";
    public static final String HEADER_SCHEMA_VERSION = "1.0";
    public static final String HEADER_SUB_DOMAIN_NAME = "employee";
    public static final String HEADER_DOMAIN_SOURCE = "HRSystem";
    public static final String HEADER_DOMAIN_MESSAGEID = "HRSystem";
    public static final String HEADER_IDENTIFIER = "HRSystem/lanId";
    
}

服務.java

public void process(Employee employee) {
        logger.info("process employee data started");
        
        CanonMessage message = new CanonMessage();
        
        // Set Header Record start
        String correlationId = java.util.UUID.randomUUID().toString();
        
        logger.info("correlationId - "+correlationId);
        
        List<String> subDomainNameList = new ArrayList<>();
        subDomainNameList.add(Constants.HEADER_SUB_DOMAIN_NAME);
        Domain domain = new Domain(Constants.HEADER_DOMAIN_NAME, Constants.HEADER_SCHEMA_VERSION, subDomainNameList);
        List<Domain> domainList = new ArrayList<>();
        domainList.add(domain);
        Identifier identifier = new Identifier();
        List<Identifier> identifierList = new ArrayList<>();
        identifier.setId(Constants.HEADER_IDENTIFIER);
        identifier.setValue(employee.getLanId());
        identifierList.add(identifier);
        Header header = new Header(domainList, identifierList, Constants.HEADER_DOMAIN_SOURCE, correlationId);
        List<Header> headerList = new ArrayList<>();
        headerList.add(header);
        message.setMetadata(headerList);
        // Set Header Record end
        
        // Set Employee Payload Record start
        List<Employee> employeeList = new ArrayList<>();
        employeeList.add(employee);
        message.setEmployee(employeeList);
        // Set Employee Payload Record start
        
        // Set Audit Record start
        SourceAuditRecord sourceAuditRecord = new SourceAuditRecord();
        sourceAuditRecord.setSystem(Constants.HEADER_DOMAIN_SOURCE);
        
        Timestamp timestamp = new Timestamp();
        DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime myDateObj = LocalDateTime.now();
        String currentDateString = myDateObj.format(myFormatObj);
        logger.info("currentDateString - "+currentDateString);
        timestamp.setCreated(currentDateString);
        timestamp.setSent(currentDateString);
        List<Timestamp> timestampList = new ArrayList<>();
        timestampList.add(timestamp);
        
        sourceAuditRecord.setTimestamp(timestampList);
        
        List<SourceAuditRecord> sourceAuditRecordList = new ArrayList<>();
        sourceAuditRecordList.add(sourceAuditRecord);
        
        message.setSourceAuditRecord(sourceAuditRecordList);
        // Set Audit Record end
        
        // Set Trailer Record start
        String sha256hex = DigestUtils.sha256Hex(Constants.SHA_256_HEX);
        logger.info("sha256hex - "+sha256hex);
        
        List<Trailer> trailerList = new ArrayList<>();
        Trailer trailer = new Trailer();
        trailer.setChecksum(Constants.SHA_256_HEX);
        trailer.setValue(sha256hex);
        trailerList.add(trailer);
        
        message.setTrailer(trailerList);
        
        JAXBContext context;
        try {
            context = JAXBContext.newInstance(CanonMessage.class);
            Marshaller jaxbMarshaller = context.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

            // Write to System.out
            jaxbMarshaller.marshal(message, System.out);
            
            StringBuffer sb = new StringBuffer();
            StringWriter sw = new StringWriter();
            jaxbMarshaller.marshal(message, sw);
            String xmlString = sw.toString();
            System.out.println("xmlString - "+xmlString);
            
            SolaceTopicPublisher publisher = new SolaceTopicPublisher();
            publisher.publishMessage(xmlString);
            
            logger.info("Employee data processed");
        } catch (JAXBException e) {
            logger.error("Error occurred while creating XML data : "+e.getMessage());
            e.printStackTrace();
        }
        
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM