如何用Java将CSV数据转换为指定属性格式的XML文件?
解决CSV转XML时将字段转为row元素属性的问题
你的代码当前是把CSV的每一列作为<row>的子节点生成XML,但目标格式要求将这些列作为<row>的属性。以下是修改后的完整代码:
public void convertFile(String csvFileName, String xmlFileName, String delimiter) { try { Document newDoc = domBuilder.newDocument(); // 根元素 Element rootElement = newDoc.createElement("root"); newDoc.appendChild(rootElement); // 读取CSV文件 BufferedReader csvReader = new BufferedReader(new FileReader(csvFileName)); String[] csvFields = null; String curLine = csvReader.readLine(); if (curLine != null) { // 解析CSV表头 StringTokenizer stringTokenizer = new StringTokenizer(curLine, delimiter); int fieldCount = stringTokenizer.countTokens(); if (fieldCount > 0) { csvFields = new String[fieldCount]; int i = 0; while (stringTokenizer.hasMoreElements()) { csvFields[i++] = String.valueOf(stringTokenizer.nextElement()); } } } // 解析CSV数据行 while ((curLine = csvReader.readLine()) != null) { StringTokenizer stringTokenizer = new StringTokenizer(curLine, delimiter); int fieldCount = stringTokenizer.countTokens(); if (fieldCount > 0 && csvFields != null) { Element rowElement = newDoc.createElement("row"); int i = 0; while (stringTokenizer.hasMoreElements()) { try { String curValue = String.valueOf(stringTokenizer.nextElement()); // 将CSV字段转为row元素的属性 rowElement.setAttribute(csvFields[i++], curValue); } catch (Exception exp) { // 建议不要空捕获,至少打印异常信息 exp.printStackTrace(); } } rootElement.appendChild(rowElement); } } csvReader.close(); // 配置Transformer,输出XML声明并格式化缩进 TransformerFactory tranFactory = TransformerFactory.newInstance(); Transformer aTransformer = tranFactory.newTransformer(); aTransformer.setOutputProperty(OutputKeys.VERSION, "1.0"); aTransformer.setOutputProperty(OutputKeys.INDENT, "yes"); aTransformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); Source src = new DOMSource(newDoc); Result result = new StreamResult(new File(xmlFileName)); aTransformer.transform(src, result); } catch (IOException exp) { System.err.println(exp.toString()); } catch (Exception exp) { System.err.println(exp.toString()); } }
关键改动说明
- 属性化处理:移除了创建子元素的逻辑,改用
rowElement.setAttribute()方法,直接将CSV的字段名作为XML属性名,字段值作为属性值,完全匹配目标格式要求。 - XML格式优化:给Transformer添加了输出配置,确保生成的XML包含版本声明,并且自动缩进,和目标示例的排版一致。
- 健壮性提升:增加了
csvFields != null的判断,避免表头解析失败时出现空指针异常;同时建议不要空捕获异常,方便排查数据解析时的问题。
内容的提问来源于stack exchange,提问作者rx4i
相关产品推荐
相关产品推荐

