You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:01:12