4est
4est

Reputation: 3168

save xml data to CSV

I have simple class to read XML file from the disc.

I don't know, how to save the result to CSV file? Can you please help me?

package praser;   
public class ReadXML {

    public static void main(String[] args) throws Exception{

        File xmlFile = new File("C:\\test2.xml");                
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();            
        Document document = documentBuilder.parse(xmlFile);            
        NodeList list = document.getElementsByTagName("Developer");

        for (int i = 0; i < list.getLength(); i++) {

            Node node = list.item(i);                
            if(node.getNodeType() == Node.ELEMENT_NODE){                    
                Element element = (Element) node;                    
                System.out.println("Id: " + element.getAttribute("Id"));
                System.out.println("Name " + element.getElementsByTagName("Name").item(0).getTextContent());
                System.out.println("Surname " + element.getElementsByTagName("Surname").item(0).getTextContent());
                System.out.println("Age " + element.getElementsByTagName("Age").item(0).getTextContent());
            }  }}}     

My xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Developer Id="1">
    <Name>Tom</Name>
    <Surname>Hawk</Surname>
    <Age>100</Age>

    <Name>Tom2</Name>
    <Surname>Hawk2</Surname>
    <Age>200</Age>
</Developer>

Upvotes: 0

Views: 738

Answers (3)

Praveen Singh
Praveen Singh

Reputation: 1

To get the data in separate column you have to use delimiters as comma ,.

  1. If you just want data in below format without filling the data in specific colum Example :
ID;Name;Age
01;Deepak;22

For above result you have to use semi column ; as delimiter.

  1. If you want to put data in the columns you have to use comma , as delimiter.

Upvotes: 0

Coder
Coder

Reputation: 2044

You can use following code to write the content in to csv file. This solution is based on the initial XML provided in the question as below.

<Developer Id="1">
  <Name>Tom</Name>
  <Surname>Hawk</Surname>
  <Age>100</Age>
</Developer>

The code to read this xml and save it to csv can used following java code

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.*;

public class ReadXML {

public static void main(String[] args) throws Exception {

    File xmlFile = new File("C:\\test2.xml");
    File outputFile = new File("Output.csv");
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    Document document = documentBuilder.parse(xmlFile);
    NodeList list = document.getElementsByTagName("Developer");


    BufferedWriter bw = null;
    FileWriter fw = null;
    try {
        if (!outputFile.exists()) {
            outputFile.createNewFile();
        }
        // true = append file
        fw = new FileWriter(outputFile.getAbsoluteFile(), true);
        bw = new BufferedWriter(fw);

        for (int i = 0; i < list.getLength(); i++) {

            Node node = list.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                System.out.println("Id: " + element.getAttribute("Id"));
                System.out.println("Name " + element.getElementsByTagName("Name").item(0).getTextContent());
                System.out.println("Surname " + element.getElementsByTagName("Surname").item(0).getTextContent());
                System.out.println("Age " + element.getElementsByTagName("Age").item(0).getTextContent());
                bw.write(element.getAttribute("Id") + ","
                        + element.getElementsByTagName("Name").item(0).getTextContent() + ","
                        + element.getElementsByTagName("Surname").item(0).getTextContent() + ","
                        + element.getElementsByTagName("Age").item(0).getTextContent() + "," + "\n");
            }
        }

    }

    catch (IOException e) {
        // catch block
        e.printStackTrace();
    } finally {

        try {

            if (bw != null)
                bw.close();

            if (fw != null)
                fw.close();

        } catch (IOException ex) {

            ex.printStackTrace();

        }
    }

}
}

Output.csv will be give similar to below screen.

enter image description here

Upvotes: 0

Boola
Boola

Reputation: 358

use this code segment :

package praser;
public class ReadXML {

public static void main(String[] args) throws Exception{

    File xmlFile = new File("C:\\test2.xml");                
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();            
    Document document = documentBuilder.parse(xmlFile);            
    NodeList list = document.getElementsByTagName("Developer");

Writer writer = new OutputStreamWriter(new FileOutputStream("pathToFile"), "UTF-8");
BufferedWriter bw = new BufferedWriter(writer);
String id, name, surname, age, line;

    for (int i = 0; i < list.getLength(); i++) {

        Node node = list.item(i);                
        if(node.getNodeType() == Node.ELEMENT_NODE){                    
            Element element = (Element) node;       
            id = element.getAttribute("Id");
            name = element.getElementsByTagName("Name").item(0).getTextContent();
            surname = element.getElementsByTagName("Surname").item(0).getTextContent();
            age = element.getElementsByTagName("Age").item(0).getTextContent();
            line = String.format("%s\t%s\t%s\t%s", id, name, surname, age);
            bw.write(line);
            bw.newLine();
            bw.flush();             
        }  }}} 

Input file :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Data>
<Developer Id="1">
    <Name>Tom</Name>
    <Surname>Hawk</Surname>
    <Age>100</Age>
</Developer>
<Developer Id="2">
    <Name>jessy</Name>
    <Surname>Jay</Surname>
    <Age>16</Age>
</Developer>
</Data>

output :

1   Tom Hawk    100
2   jessy   Jay 16

Upvotes: 1

Related Questions