This post will explain, how to read xml ,parse xml and write to a flat file with fixed length format.
Step 1: Create a maven project -< xmltofile>
Step2: paste the below code into pom.xml file.
4.0.0 xmltofile xmltofile 0.0.1-SNAPSHOT src maven-compiler-plugin 3.5.1 1.8 com.ancientprogramming.fixedformat4j fixedformat4j 1.2.2
Step 3: Now we need to create company.xml file under project- create one xml file add the below xml to that file.
siva 34 Male 35000 01/07/1983 Present Bangalore Karnataka India Permanent Kadapa AndharaPradesh India Sanjay 27 Male 55000 01/07/1988 Present Bangalore Karnataka India Permanent Hyderabad Telangana India Madhan 34 Male 800000 01/07/1983 Present and Permanent Bangalore Karnataka India
Step 4: Create pojo classes , which need to be parsed as per above xml.
i have created 3 classes - Company.java -> List of Employee.java -> List Of Address.java
Company.java - xmlroot elment is company which is there in xml.
package xmltofile; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="company") public class Company { private Listemployee = new ArrayList (); @XmlElement(name="employee") public List getEmployee() { return employee; } public void setEmployee(List employee) { this.employee = employee; } }
Employee.java
package xmltofile; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlElement; public class Employee { private String name; private int age; private String gender; private Double salary; private String dob; Listaddress = new ArrayList(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } @XmlElement public ListgetAddress() { return address; } public void setAddress(Listaddress) { this.address = address; } public String getDob() { return dob; } public void setDob(String dob) { this.dob = dob; } }
Address.java
package xmltofile; import javax.xml.bind.annotation.XmlRootElement; public class Address { private String city; private String type; private String state; private String country; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }
Step 5: Now we need to write class using fixedformat4j API-
CompanyHeader.java
package xmltofile.fixedformat; import com.ancientprogramming.fixedformat4j.annotation.Field; import com.ancientprogramming.fixedformat4j.annotation.Record; @Record public class CompanyHeader { private String header1; private String header2; private String header3; @Field(offset = 1, length = 20) public String getHeader1() { return header1; } public void setHeader1(String header1) { this.header1 = header1; } @Field(offset = 30, length = 50) public String getHeader2() { return header2; } public void setHeader2(String header2) { this.header2 = header2; } @Field(offset = 60, length = 100) public String getHeader3() { return header3; } public void setHeader3(String header3) { this.header3 = header3; } }
EmployeeHeader.java- This class will have - each filed -at what is the starting index and data length of the eachfiled
package xmltofile.fixedformat; import com.ancientprogramming.fixedformat4j.annotation.Field; import com.ancientprogramming.fixedformat4j.annotation.Record; @Record public class EmployeeHeader { private String nameHeader; private String ageHeader; private String genderHeader; private String salaryHeader; private String dobHeader; private String addressHeader; @Field(offset = 1, length = 50) public String getNameHeader() { return nameHeader; } public void setNameHeader(String nameHeader) { this.nameHeader = nameHeader; } @Field(offset = 55, length = 3) public String getAgeHeader() { return ageHeader; } public void setAgeHeader(String ageHeader) { this.ageHeader = ageHeader; } @Field(offset = 60, length = 10) public String getGenderHeader() { return genderHeader; } public void setGenderHeader(String genderHeader) { this.genderHeader = genderHeader; } @Field(offset = 75, length = 10) public String getSalaryHeader() { return salaryHeader; } public void setSalaryHeader(String salaryHeader) { this.salaryHeader = salaryHeader; } @Field(offset = 90, length = 15) public String getDobHeader() { return dobHeader; } public void setDobHeader(String dobHeader) { this.dobHeader = dobHeader; } @Field(offset = 120, length = 200) public String getAddressHeader() { return addressHeader; } public void setAddressHeader(String addressHeader) { this.addressHeader = addressHeader; } }
Step 6: Now we need to write test class to Parse the employee.xml using JAXB context and create the Flat file
and write the xml data into file at specified index.
XMLReaderAndWriteToFile.java
package xmltofile; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import com.ancientprogramming.fixedformat4j.format.FixedFormatManager; import com.ancientprogramming.fixedformat4j.format.impl.FixedFormatManagerImpl; import xmltofile.fixedformat.CompanyHeader; import xmltofile.fixedformat.EmployeeHeader; public class XMLReaderAndWriteToFile { public static void main(String[] args) { BufferedWriter bw = null; try { JAXBContext context = JAXBContext.newInstance(Company.class); // Create Unmarshaller using JAXB context Unmarshaller unmarshaller = context.createUnmarshaller(); System.out.println("xml file started to load..."); Company company = (Company) unmarshaller.unmarshal(new File("employee.xml")); System.out.println("xml file loaded and parsed successfully.."); // Write to file with fixedformat System.out.println("Flat file started to create..."); bw = new BufferedWriter(new FileWriter("fixedLength.txt", true)); System.out.println("empty flat file created..."); getCompanyHeader(bw); System.out.println("company header written successfully to file."); getEmployeeHeader(bw); System.out.println("employee header written successfully to file."); for (Employee employee : company.getEmployee()) { EmployeeHeader employeeDetails = new EmployeeHeader(); employeeDetails.setNameHeader(employee.getName()); employeeDetails.setAgeHeader(String.valueOf(employee.getAge())); employeeDetails.setGenderHeader(employee.getGender()); employeeDetails.setDobHeader(String.valueOf(employee.getDob())); employeeDetails.setSalaryHeader(String.valueOf(employee.getSalary())); String completeAddress = " "; for (Address address : employee.getAddress()) { String addressDetails = address.getCity() + " " + address.getState() + " " + address.getCountry() + " - " + address.getType(); completeAddress = completeAddress.concat(addressDetails) + " "; } employeeDetails.setAddressHeader(completeAddress); FixedFormatManager manager1 = new FixedFormatManagerImpl(); String data1 = manager1.export(employeeDetails); bw.write(data1); bw.newLine(); } System.out.println("Employee details written successfully to file."); } catch (Exception ex) { ex.printStackTrace(); } finally { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void getEmployeeHeader(BufferedWriter bw) throws IOException { EmployeeHeader employeeHeader = new EmployeeHeader(); employeeHeader.setNameHeader("Employee Name"); employeeHeader.setAgeHeader("Age"); employeeHeader.setGenderHeader("Gender"); employeeHeader.setDobHeader("DOB"); employeeHeader.setSalaryHeader("Salary"); employeeHeader.setAddressHeader("Address"); FixedFormatManager manager = new FixedFormatManagerImpl(); String data = manager.export(employeeHeader); bw.write(data); bw.newLine(); bw.newLine(); bw.newLine(); } private static void getCompanyHeader(BufferedWriter bw) throws IOException { CompanyHeader companyHeader = new CompanyHeader(); companyHeader.setHeader1("ABC Company"); companyHeader.setHeader2("Bangalore"); companyHeader.setHeader3("India"); FixedFormatManager manager = new FixedFormatManagerImpl(); String data = manager.export(companyHeader); bw.write(data); bw.newLine(); bw.newLine(); bw.newLine(); } }
Output file will be like this.
ABC Company Bangalore Employee Name Age Gender Salary DOB Address siva 34 Male 35000.0 01/07/1983 Bangalore Karnataka India - Present Kadapa AndharaPradesh India - Permanent Sanjay 27 Male 55000.0 01/07/1988 Bangalore Karnataka India - Present Hyderabad Telangana India - Permanent Madhan 34 Male 800000.0 01/07/1983 Bangalore Karnataka India - Present and Permanent
Thank you verymuch for viewing this post. If you like this don't forget to share.