简体   繁体   中英

Converting CSV File to Hierarchy XML in JAVA with JAXB

I need to create a Hierarchical XML using CSV file.

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

I tried to do it with JAXB and create the classes manually

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);

But my issue is that I want to read the Value of each node from my csv file not manually in the code

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

Can anyone help me how can I read it from my sample.csv file instead of manually?

try with following solution,

firstly read the csv file and collect the objects (person) from individual lines. then marshal the list of objects to xml file

People.java (root element of xml file)

@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 (child elements of parent (people) element)

@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;
    }
}

marshaling with 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 of list. because it holds 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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM