如何使用Java读取XML文件并提取指定标签内容写入新XML文件
Java 提取XML指定标签生成新文件实现方案
首先给出示例原Xmlfile.xml参考结构:
<?xml version="1.0" encoding="UTF-8"?> <users> <user> <id>1</id> <name>张三</name> <age>25</age> <email>zhangsan@example.com</email> </user> <user> <id>2</id> <name>李四</name> <age>30</age> <email>lisi@example.com</email> </user> </users>
以下是基于JDK自带DOM解析器的实现方案,无需引入第三方依赖,适合中小体积XML文件处理:
实现步骤
- 加载原XML文件到DOM文档对象
- 创建新的DOM文档对象作为输出载体
- 从原文档中筛选出所有
email标签节点 - 将筛选到的节点导入新文档后写入到目标文件
完整代码
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.File; public class ExtractXmlTag { public static void main(String[] args) { try { // 加载源XML文件 File sourceFile = new File("Xmlfile.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document sourceDoc = builder.parse(sourceFile); sourceDoc.getDocumentElement().normalize(); // 初始化目标XML文档 Document targetDoc = builder.newDocument(); Element root = targetDoc.createElement("emails"); targetDoc.appendChild(root); // 提取所有email标签并导入目标文档 NodeList emailNodes = sourceDoc.getElementsByTagName("email"); for (int i = 0; i < emailNodes.getLength(); i++) { Node importNode = targetDoc.importNode(emailNodes.item(i), true); root.appendChild(importNode); } // 输出到新文件 Transformer transformer = TransformerFactory.newInstance().newTransformer(); // 设置输出格式化缩进 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); transformer.transform(new DOMSource(targetDoc), new StreamResult(new File("newxmlfile.xml"))); System.out.println("新文件生成完成"); } catch (Exception e) { e.printStackTrace(); } } }
注意:如果需要保留email标签的上层父节点结构,只需要在筛选节点时同步复制对应父节点到新文档即可,上述示例默认将所有email标签统一放在新的根节点下。
大文件处理提示
如果需要处理GB级别的超大XML文件,建议使用SAX解析器实现,逐行扫描源文件,仅遇到目标标签时写入新文件,避免内存溢出。
生成的newxmlfile.xml示例输出
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <emails> <email>zhangsan@example.com</email> <email>lisi@example.com</email> </emails>
内容的提问来源于stack exchange,提问作者GAJENDRAN
相关产品推荐
相关产品推荐

