пакет com.codepressed.csvToXml;
Код: Выделить всё
import org.w3c.dom.Document;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
private static final Logger logger = Logger.getLogger(Main.class.getName());
private static final String CSV_COMMA = ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
private static final String CSV_SEMICOLON = ";(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
private static final String SEMICOLON_PARAMETER = "-s";
/**
* Executes the CSV to XML conversion
* @param args [0] = Input file*, [1] = Output file*, [2] = Elements names, [3] = csv type.
* @author Daniel Apesteguia Timoner (Codepressed)
*/
public static void main(String[] args) {
//Arg validator
if (args.length =3 && !args[3].equals(SEMICOLON_PARAMETER) ? args[2] : "element";
String csvSplit = (args.length>3 && args[3].equals(SEMICOLON_PARAMETER) || args.length>4 && args[4].equals(SEMICOLON_PARAMETER)) ? CSV_SEMICOLON:CSV_COMMA;
List elements = XMLutils.readCsvFile(csvFile, csvSplit);
Document xmlDoc = XMLutils.createXmlDocument(elements, elementName);
if(XMLutils.writeXmlDocumentToFile(xmlDoc, xmlFile)){
logger.log(Level.INFO, "File was created successfully.");
}
}
}
package com.codepressed.csvToXml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class XMLutils {
private static String rjct;
private static String verfElement;
private static final Logger logger = Logger.getLogger(XMLutils.class.getName());
private XMLutils(){
throw new IllegalStateException("This is a utility class.");
}
public static boolean writeXmlDocumentToFile(Document xmlDoc, String xmlFilePath) {
try {
TransformerFactory xmlTransformerFactory = TransformerFactory.newInstance();
//To protect from XXE attacks
xmlTransformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
xmlTransformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
Transformer xmlTransformer = xmlTransformerFactory.newTransformer();
xmlTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
xmlTransformer.setOutputProperty(OutputKeys.METHOD, "xml");
xmlTransformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
xmlTransformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
try (FileOutputStream outputStream = new FileOutputStream(xmlFilePath)) {
xmlTransformer.transform(new DOMSource(xmlDoc), new StreamResult(outputStream));
}
return true;
} catch (TransformerException | IOException e) {
logger.log(Level.SEVERE, "Error writing xml document to file", e);
return false;
}
}
public static Document createXmlDocument(List xmlElements, String elementName) {
try {
DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder xmlBuilder = xmlFactory.newDocumentBuilder();
Document xmlDoc = xmlBuilder.newDocument();
Instant instant = Instant.now();
Element rootElement = xmlDoc.createElement("CstmrPmtStsRpt");
xmlDoc.appendChild(rootElement);
Element mainElement = xmlDoc.createElement("GrpHdr");
rootElement.appendChild(mainElement);
Element childElementMsgId = xmlDoc.createElement("MsgId");
mainElement.appendChild(childElementMsgId);
Text painValue = xmlDoc.createTextNode("PAIN0021611221065");
childElementMsgId.appendChild(painValue);
Element childElementCreDtTm = xmlDoc.createElement("CreDtTm");
mainElement.appendChild(childElementCreDtTm);
Text currentTime = xmlDoc.createTextNode(instant.toString());
childElementCreDtTm.appendChild(currentTime);
Element childElementInitgPty = xmlDoc.createElement("InitgPty");
mainElement.appendChild(childElementInitgPty);
Element childElementId = xmlDoc.createElement("Id");
childElementInitgPty.appendChild(childElementId);
Element childElementOrgId = xmlDoc.createElement("OrgId");
childElementId.appendChild(childElementOrgId);
Element childElementBICOrBEI = xmlDoc.createElement("BICOrBEI");
childElementOrgId.appendChild(childElementBICOrBEI);
Element mainElement1 = xmlDoc.createElement("OrgnlGrpInfAndSts");
rootElement.appendChild(mainElement1);
Element childElementOrgnlMsgId = xmlDoc.createElement("OrgnlMsgId");
mainElement1.appendChild(childElementOrgnlMsgId);
Element childElementOrgnlMsgNmId = xmlDoc.createElement("OrgnlMsgNmId");
mainElement1.appendChild(childElementOrgnlMsgNmId);
Element childElementOrgnlNbOfTxs = xmlDoc.createElement("OrgnlNbOfTxs");
mainElement1.appendChild(childElementOrgnlNbOfTxs);
Element childElementOrgnlCtrlSum = xmlDoc.createElement("OrgnlCtrlSum");
mainElement1.appendChild(childElementOrgnlCtrlSum);
Element childElementGrpSts = xmlDoc.createElement("GrpSts");
mainElement1.appendChild(childElementGrpSts);
Text rjctValue = xmlDoc.createTextNode(rjct);
childElementGrpSts.appendChild(rjctValue);
Element childElementStsRsnInf = xmlDoc.createElement("StsRsnInf");
mainElement1.appendChild(childElementStsRsnInf);
Element childElementRsn = xmlDoc.createElement("Rsn");
childElementStsRsnInf.appendChild(childElementRsn);
Element childElementCd = xmlDoc.createElement("Cd");
childElementRsn.appendChild(childElementCd);
String ver = verfElement.length() < 4 ? verfElement : verfElement.substring(0, 4);
Text verfElementValue = xmlDoc.createTextNode(ver);
childElementCd.appendChild(verfElementValue);
Element childElementAddtlInf = xmlDoc.createElement("AddtlInf");
childElementStsRsnInf.appendChild(childElementAddtlInf);
//OrgnlPmtInfAndSts
if(xmlElements!=null) {
logger.log(Level.INFO, String.valueOf(xmlElements.size()));
int j =0;
for (String[] node : xmlElements) {
j++;
if(j==1){
continue;
}
Element mainElement2 = xmlDoc.createElement("OrgnlPmtInfAndSts");
rootElement.appendChild(mainElement2);
Element childElementOrgnlPmtInfId = xmlDoc.createElement("OrgnlPmtInfId");
mainElement2.appendChild(childElementOrgnlPmtInfId);
Text OrgnlPmtInfIdValue = xmlDoc.createTextNode(node[0].trim());
childElementOrgnlPmtInfId.appendChild(OrgnlPmtInfIdValue);
Element childElementOrgnlNbOfTxs1 = xmlDoc.createElement("OrgnlNbOfTxs");
mainElement2.appendChild(childElementOrgnlNbOfTxs1);
Element childElementOrgnlCtrlSum1 = xmlDoc.createElement("OrgnlCtrlSum");
mainElement2.appendChild(childElementOrgnlCtrlSum1);
Element childElementPmtInfSts = xmlDoc.createElement("PmtInfSts");
mainElement2.appendChild(childElementPmtInfSts);
Element childElementTxInfAndSts = xmlDoc.createElement("TxInfAndSts");
mainElement2.appendChild(childElementTxInfAndSts);
Element childElementOrgnlEndToEndId = xmlDoc.createElement("OrgnlEndToEndId");
mainElement2.appendChild(childElementOrgnlEndToEndId);
Text OrgnlEndToEndIdValue = xmlDoc.createTextNode(node[1].trim());
childElementOrgnlEndToEndId.appendChild(OrgnlEndToEndIdValue);
Element childElementTxSts = xmlDoc.createElement("TxSts");
mainElement2.appendChild(childElementTxSts);
Element childAddtlInf = xmlDoc.createElement("AddtlInf");
mainElement2.appendChild(childAddtlInf);
Text AddtlInfValue = xmlDoc.createTextNode(node[5].trim());
childAddtlInf.appendChild(AddtlInfValue);
// }
}
}
boolean headerDefined = false;
String[] header = new String[xmlElements.size()];
// for (String[] node : xmlElements) {
// if (headerDefined) {
// Element nodesElements = xmlDoc.createElement(elementName);
// mainElement.appendChild(nodesElements);
//
// for (int j = 0; j < node.length; j++) {
// node[j] = node[j].replace("\"", "").trim();
// Element nodesValues = xmlDoc.createElement(header[j]);
// nodesElements.appendChild(nodesValues);
// Text nodeTxt = xmlDoc.createTextNode(node[j]);
// nodesValues.appendChild(nodeTxt);
// }
// } else {
// header = node;
// for (int j = 0; j < node.length; j++) {
// header[j] = header[j].replaceAll("[^a-zA-Z0-9]", "");
// if(isParsableToInt(header[j])) {
// header[j] = "node" + header[j];
// }
// }
// headerDefined = true;
// }
// }
return xmlDoc;
} catch (ParserConfigurationException e) {
logger.log(Level.SEVERE, "Error creating the xml document", e);
return null;
}
}
public static List readCsvFile(String csvFilePath, String separator) {
List elements = new ArrayList();
String[] verfName ;
try (BufferedReader reader = Files.newBufferedReader(Paths.get(csvFilePath))) {
String line;
while ((line = reader.readLine()) != null) {
String[] nodes = line.split(separator);
elements.add(nodes);
}
} catch(IOException e){
logger.log(Level.SEVERE, "Error reading the csv file", e);
}
verfName = elements.get(0);
String v=Arrays.toString(verfName);
String [] verf = v.split(",");
int i=0;
for(String m :verf){
i++;
if(i==5){
rjct = m.trim();
}
if(i==6){
verfElement = m.trim();
}
}
//logger.log(Level.INFO, Arrays.toString(verfName));
return elements;
}
public static boolean isParsableToInt(String input){
try{
Integer.parseInt(input);
return true;
}catch(NumberFormatException e){
logger.log(Level.INFO, "One of the columns is a int. We will add to it a 'node' prefix.");
return false;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... o-xml-java
Мобильная версия