如何在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
相关产品推荐
相关产品推荐

