i would like to convert from CSV to XML with Java/Javascript.
For example my CSV file is like this table:
| 12345 | TLC |
| 12345 | VPN |
| 67890 | TLC |
I would like to have an XML file like this:
<?xml version='1.0' encoding='UTF-8'?>
<Custom name="Custom_ListaOLO">
<Attributes>
<Map>
<entry key="12345">
<value>
<List>
<String>TLC</String>
<String>VPN</String>
</List>
</value>
</entry>
<entry key="67890">
<value>
<List>
<String>TLC</String>
</List>
</value>
</entry>
</Map>
</Attributes>
</Custom>
or:
<?xml version='1.0' encoding='UTF-8'?>
<Custom name="Custom_ListaOLO">
<Attributes>
<Map>
<entry key="12345">
<value>
<List>
<String>TLC</String>
<String>VPN</String>
</List>
</value>
</entry>
<entry key="67890", value="TLC />
</Map>
</Attributes>
</Custom>
Can you help me?
you can fulfill the above requirement using JAXB marshaling with the MOXy implementation.
JAXB Java Architecture for XML Binding (JAXB) is a software framework that provides way to map Java classes to XML representations. for more info
JAXB MARSHALING converting the java objects to xml. for more info
MOXy enable developers to handle the complex XML structures. for more info
firstly read the csv file and create java objects, then convert java objects to xml using jaxb marshaling with moxy implementation.
try with following solution,
create two java pojo classes (Custom
and Entry
) for represented <Custom>
and <entry>
elements of xml file,
Custom.java
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name="Custom")
public class Custom {
private String name;
private List<Entry> entry;
public String getName() {
return name;
}
@XmlAttribute
public void setName(String name) {
this.name = name;
}
public Custom() {
entry = new ArrayList<Entry>();
}
@XmlPath("Attributes/Map/entry")
public List<Entry> getEntry() {
return entry;
}
public void setEntry(List<Entry> entry) {
this.entry = entry;
}
}
Entry.java
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import org.eclipse.persistence.oxm.annotations.XmlPath;
public class Entry {
private String key;
private List<String> string;
public Entry() {
string = new ArrayList<String>();
}
@XmlAttribute
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@XmlPath("value/List/String/text()")
public List<String> getString() {
return string;
}
public void setString(List<String> string) {
this.string = string;
}
}
read the csv file, create java objects and convert it to xml,
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.xmlmodel.ObjectFactory;
public class Demo {
public static void main(String[] args) throws JAXBException {
String line;
String key = null;
Custom custom = new Custom();
Entry entry = null;
int index = 0;
try {
BufferedReader br = new BufferedReader(new FileReader("inputCSV.csv")); //get csv file
while ((line = br.readLine()) != null) { //get every single line individually in csv file
if(index > 0){ //skip the column's names (first line of csv file)
String[] value = line.split(","); //collect the comma separated values (ID and OLO) into array
if(key == null || !key.equals(value[0])){ //first line of the csv file and when find the new key value, then create new entry
if(entry != null){
custom.getEntry().add(entry); //add entry object into entry list of custom
}
key = value[0]; //assign the key value to variable (String key) for identify the new entry
entry = new Entry(); //create a new entry
entry.setKey(value[0]); //assign the key value to entry
entry.getString().add(value[1]); //add string value String list of entry with new key
}else{
entry.getString().add(value[1]); //add string value String list of entry under the same key
}
}
index++;
}
custom.setName("Custom_ListaOLO"); //set value to name attribute of custom element
custom.getEntry().add(entry); //add last entry into entry list of custom
} catch (IOException e) {
e.printStackTrace();
}
//marshaling with JAXB
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[]{Custom.class, ObjectFactory.class}, null);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(custom, new File("output.xml")); //generate the output xml file
marshaller.marshal(custom, System.out);
}
}
inputCSV.csv
ID,OLO
12345,TLC
12345,VPN
67890,TLC
output.xml
<?xml version="1.0" encoding="UTF-8"?>
<Custom name="Custom_ListaOLO">
<Attributes>
<Map>
<entry key="12345">
<value>
<List>
<String>TLC</String>
<String>VPN</String>
</List>
</value>
</entry>
<entry key="67890">
<value>
<List>
<String>TLC</String>
</List>
</value>
</entry>
</Map>
</Attributes>
</Custom>