使用JAXB在JAVA中将CSV文件转换为层次结构XML

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JAXB在JAVA中将CSV文件转换为层次结构XML相关的知识,希望对你有一定的参考价值。

我需要使用CSV文件创建层次结构XML。

id,firstname,Lastname
1,yong,mook kim
2, Alez, Aunritod
,...

我尝试使用JAXB并手动创建类

public class WriteXMLFile 

    public static void main(String argv[]) 

      try 

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

        // root elements
        Document doc = docBuilder.newDocument();
        Element rootElement = doc.createElement("company");
        doc.appendChild(rootElement);

        // staff elements
        Element staff = doc.createElement("Staff");
        rootElement.appendChild(staff);

        // set attribute to staff element
        Attr attr = doc.createAttribute("id");
        attr.setValue("1");
        staff.setAttributeNode(attr);

        Element firstname = doc.createElement("firstname");
        firstname.appendChild(doc.createTextNode("yong"));
        staff.appendChild(firstname);

        // lastname elements
        Element lastname = doc.createElement("lastname");
        lastname.appendChild(doc.createTextNode("mook kim"));
        staff.appendChild(lastname);

但是我的问题是我想从我的csv文件中读取每个节点的值,而不是在代码中手动进行此操作

        Element firstname = doc.createElement("firstname");
        firstname.appendChild(doc.createTextNode("yong"));
        staff.appendChild(firstname);

有人可以帮助我如何从sample.csv文件中读取而不是手​​动读取?

答案

尝试以下解决方案,

首先读取csv文件,并从各行中收集对象(人)。然后将对象列表编组到xml文件

People.java(xml文件的根元素)

@XmlRootElement(name="people")
@XmlAccessorType (XmlAccessType.FIELD)
public class People 

    @XmlElement(name="person")
    private List<Person> listPerson;

    public List<Person> getListPerson() 
        return listPerson;
    
    public void setListPerson(List<Person> listPerson) 
        this.listPerson = listPerson;
    

Person.java(父(人)元素的子元素)

@XmlRootElement(name="person")
@XmlAccessorType (XmlAccessType.FIELD)
public class Person 

    private String id;
    private String firstName;
    private String lastName;

    public String getId() 
        return id;
    
    public void setId(String id) 
        this.id = id;
    
    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;
    

使用Java封送处理

public class Marshaller 

    public static void main(String[] args) 

        BufferedReader br;
        String line;
        People people = new People();
        ArrayList<Person> list = new ArrayList();

        //read the csv file and collect the person objects
        try 
            br = new BufferedReader(new FileReader("inputCSV.csv"));
            while ((line = br.readLine()) != null)     //get every single line individually in csv file
                String[] value = line.split(",");   //collect the comma separated values into array
                Person person = new Person();
                person.setId(value[0]); //first element of an array is id
                person.setFirstName(value[1]);  //second element of an array is firstName
                person.setLastName(value[2]);   //third element of an array is lastName
                list.add(person);   //add person object into the list
            
         catch (IOException e) 
            e.printStackTrace();
        
        people.setListPerson(list); //set person object list to people
        people.getListPerson().remove(0);   //remove the first person object. because it hold the column's names

        //marshaling with java
        try 

            JAXBContext jaxbContext = JAXBContext.newInstance(People.class);
            javax.xml.bind.Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(people, new File("output.xml"));
            jaxbMarshaller.marshal(people, System.out);

         catch (JAXBException e) 
            e.printStackTrace();
        

    

inputCSV.csv

id,firstname,Lastname
1,yong,mook kim
2, Alez, Aunritod

output.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<people>
    <person>
        <id>1</id>
        <firstName>yong</firstName>
        <lastName>mook kim</lastName>
    </person>
    <person>
        <id>2</id>
        <firstName> Alez</firstName>
        <lastName> Aunritod</lastName>
    </person>
</people>

以上是关于使用JAXB在JAVA中将CSV文件转换为层次结构XML的主要内容,如果未能解决你的问题,请参考以下文章

在 Java Spring Boot 中将 CSV 转换为 JSON 数组

如何在 php 中将 Json 转换为 CSV

在 Python 中将嵌套的 JSON 转换为 CSV 文件

在 Python 中将 .dbf 批量转换为 .csv

在c#中将XML文件转换为csv文件格式

如何在 PIG 中将 XLSX 文件转换为 CSV 文件?