我想使用Java Code将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
答案 0 :(得分:2)
您可以逐行读取文件,仅提取所需的数据,并将所有内容存储到字符串的临时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;
}
一旦阅读,您可以将字符串的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数据的整体结构。
作为最后一点,您可以通过直接写入文件来删除对临时列表的需要,而不是先将值添加到列表中。不过在代码中分离输入和输出是很好的。