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

如何在Java中提取文件指定标签内容并生成分类XML文件

Java实现XML内容分类提取与生成文件

嘿,我来帮你搞定这个需求!下面是一个完整的Java解决方案,能够提取<tur>标签内容作为文件名,把同类型的<kitap>内容合并到对应的XML文件中。我选用了JDOM2库来处理XML解析,它比原生DOM API更简洁易用,处理这类场景非常顺手。

第一步:添加依赖

如果你的项目用Maven管理,直接在pom.xml里加入JDOM2的依赖:

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom2</artifactId>
    <version>2.0.6.1</version>
</dependency>

要是不用Maven,就去JDOM官方仓库下载jar包,手动添加到项目的依赖中就行。

完整实现代码

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class KitapKategorisiAyirici {

    public static void main(String[] args) {
        // 替换成你的输入文件路径
        String inputFilePath = "katalog.xml";
        // 输出文件夹路径,会自动创建不存在的目录
        String outputDir = "kitap_kategorileri/";

        // 创建输出目录(如果不存在)
        File outputDirectory = new File(outputDir);
        if (!outputDirectory.exists()) {
            boolean created = outputDirectory.mkdirs();
            if (!created) {
                System.err.println("输出目录创建失败,请检查文件权限");
                return;
            }
        }

        try {
            // 解析输入XML文件
            SAXBuilder saxBuilder = new SAXBuilder();
            Document document = saxBuilder.build(new File(inputFilePath));
            Element rootElement = document.getRootElement();

            // 获取所有<kitap>节点
            List<Element> kitapList = rootElement.getChildren("kitap");

            // 用Map存储每个分类对应的XML文档,方便同一分类的内容追加
            Map<String, Document> turDocuments = new HashMap<>();

            for (Element kitap : kitapList) {
                // 提取<tur>标签的文本内容
                Element turElement = kitap.getChild("tur");
                if (turElement == null || turElement.getTextTrim().isEmpty()) {
                    System.out.println("警告:发现没有<tur>标签的书籍节点,跳过处理");
                    continue;
                }
                String turAdi = turElement.getTextTrim();
                // 处理文件名,替换Windows系统中的非法字符
                String safeFileName = turAdi.replaceAll("[^a-zA-Z0-9\\u00C0-\\u017F\\s.-]", "_") + ".xml";
                String outputFilePath = outputDir + safeFileName;

                // 复制当前<kitap>节点,避免修改原文档
                Element kitapCopy = (Element) kitap.clone();

                // 检查该分类的文档是否已存在,不存在则创建新文档
                if (!turDocuments.containsKey(turAdi)) {
                    Document newDoc = new Document();
                    Element newRoot = new Element("katalog");
                    newDoc.setRootElement(newRoot);
                    turDocuments.put(turAdi, newDoc);
                }

                // 将当前书籍添加到对应分类的文档中
                turDocuments.get(turAdi).getRootElement().addContent(kitapCopy);
            }

            // 格式化输出XML,保证可读性
            XMLOutputter xmlOutputter = new XMLOutputter(Format.getPrettyFormat().setEncoding(StandardCharsets.UTF_8.name()));
            // 遍历所有分类,写入对应的XML文件
            for (Map.Entry<String, Document> entry : turDocuments.entrySet()) {
                String turAdi = entry.getKey();
                String safeFileName = turAdi.replaceAll("[^a-zA-Z0-9\\u00C0-\\u017F\\s.-]", "_") + ".xml";
                String outputFilePath = outputDir + safeFileName;

                try (FileOutputStream fos = new FileOutputStream(outputFilePath);
                     OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
                    xmlOutputter.output(entry.getValue(), osw);
                    System.out.println("成功生成文件:" + outputFilePath);
                } catch (IOException e) {
                    System.err.println("写入文件失败:" + outputFilePath);
                    e.printStackTrace();
                }
            }

        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
    }
}

关键逻辑说明

  • XML解析:用SAXBuilder解析输入的XML文件,高效获取所有<kitap>节点;
  • 分类存储:通过HashMap将同一<tur>分类的书籍节点聚合到同一个XML文档中,避免重复创建文件;
  • 文件名安全处理:替换掉Windows系统中不能用于文件名的特殊字符(比如/:*?"<>|),防止创建文件失败;
  • 编码与格式化:用UTF-8编码保证土耳其语等非ASCII字符正常显示,同时生成格式化的XML输出,方便阅读;
  • 异常处理:对缺失<tur>标签的节点做跳过处理,并打印警告;自动创建输出目录,避免因目录不存在报错。

注意事项

  • 确保输入的XML是格式规范的,如果有不闭合标签或语法错误,SAX解析会失败;如果你的输入是不规范的“类XML”文本,可能需要改用正则表达式提取,但正则处理XML风险较高,建议尽量规范输入格式;
  • 文件名的特殊字符处理是针对Windows系统的,如果你用Linux/macOS,可以根据需要调整正则表达式;
  • 运行前记得替换代码中的inputFilePath为你的实际输入文件路径。

内容的提问来源于stack exchange,提问作者teraRockstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:42:39