[英]How can we convert XML file to CSV using Java Code?
我想使用Java代码将XML文件转换为CSV,我不想使用XML样式表(XSL)或XSLT。 这是我的XML文件。
<?xml version="1.0" encoding="UTF-8"?>
<PickAndPlace>
<Components>
<Component id="1">
<X_Dimension>4.33</X_Dimension>
<Y_Dimension>2.962</Y_Dimension>
<Designation>None</Designation>
<Package>None</Package>
<Angle>0</Angle>
</Component>
<Component id="5">
<X_Dimension>4.33</X_Dimension>
<Y_Dimension>8.692</Y_Dimension>
<Designation>None</Designation>
<Package>None</Package>
<Angle>0</Angle>
</Component>
<Component id="9">
<X_Dimension>4.33</X_Dimension>
<Y_Dimension>14.381</Y_Dimension>
<Designation>None</Designation>
<Package>None</Package>
<Angle>0</Angle>
</Component>
</Components>
</PickAndPlace>
这是我想要的CSV输出。
X_Dimension,Y_Dimension,Designation,Package,Angle,_id
4.33,2.962,None,None,0,1
4.33,8.692,None,None,0,5
4.33,14.381,None,None,0,9
您可以逐行读取文件,仅提取所需的数据,然后将所有内容存储到字符串的临时LinkedList中:
LinkedList<String> tmpList = new LinkedList<String>();
try (
BufferedReader reader = Files.newBufferedReader(Paths.get("c:/tmp.xml"), Charset.forName("UTF-8"))) {
String line = StringUtils.EMPTY;
while ((line = reader.readLine()) != null) {
if(line.contains("<Component id=")) {
String _id = extractValue(line, "<Component id=\"", "\">");
String _xDimension = extractValue(reader.readLine(), "<X_Dimension>", "</X_Dimension>");
String _yDimension = extractValue(reader.readLine(), "<Y_Dimension>", "</Y_Dimension>");
String _designation = extractValue(reader.readLine(), "<Designation>", "</Designation>");
String _package = extractValue(reader.readLine(), "<Package>", "</Package>");
String _angle = extractValue(reader.readLine(), "<Angle>", "</Angle>");
tmpList.add(_xDimension + "," + _yDimension + "," + _designation + "," + _package + "," + _angle + "," + _id);
}
}
} catch (IOException e) {
System.err.println(e);
}
这个方便的实用方法将处理上面代码的值提取。 请注意,根据您的数据和要求,可能需要使它更健壮,但是对于您提供的样本集,它工作得很好:
private static String extractValue(String line, String prefix, String postfix) {
String value = line.trim().replaceAll(prefix, "");
value = value.replaceAll(postfix, "");
return value;
}
读取后,您可以将Strings的LinkedList写入新文件:
try{
PrintWriter writer = new PrintWriter("c:/tmp.csv", "UTF-8");
writer.println("X_Dimension,Y_Dimension,Designation,Package,Angle,_id");
for(String line : tmpList) {
writer.println(line);
}
writer.close();
} catch (IOException e) {
System.err.println(e);
}
当然,此方法在很大程度上依赖于XML数据始终如一地构造。
最后一点,您可以通过直接写到文件中而不是先将值添加到列表中来消除对临时列表的需要。 最好将代码中的输入和输出分开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.