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

如何在Java中获取下一个XML标签?附相关XML示例片段

嘿,针对你问的在Java程序里获取XML文档下一个标签的需求,结合你给出的XML片段,我给你分享两种实用的实现方式,都是Java里处理流式XML的常用方案:

首先要提个小注意:你给出的XML片段是多个根元素并列的(比如<employee>、<facilities>直接挨在一起),这不符合标准XML的单根节点规范,实际开发中一定要给它们套一个根节点(比如<company>...</company>),不然大部分XML解析器会直接报错哦。

方法一:用StAX(Streaming API for XML)—— 主动拉取节点

StAX是拉模式的解析器,你可以主动控制什么时候读取下一个节点,非常适合这种需要逐个获取标签的场景。代码示例如下:

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.StringReader;

public class StAXTagReader {
    public static void main(String[] args) {
        // 给原始XML套上根节点,符合标准格式
        String xmlContent = "<company>" +
                "<employee name = \"abc\" empId = \"100\" location = \"goa\" dept = \"IT\" />" +
                "<facilities transport=\"Y\" mealcard = \"\" driver = \"Y\"/>" +
                "<reportees manager = \"XXX\" lead = \"XXX\" VP = \"XXX\"/>" +
                "<employee name = \"XYZ\" empId = \"101\" location = \"mombai\" dept = \"IT\" />" +
                "</company>";

        try {
            // 创建StAX解析工厂和读取器
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(xmlContent));

            // 循环读取下一个节点
            while (reader.hasNext()) {
                int eventType = reader.next();
                // 只处理开始标签(忽略文本、结束标签等其他事件)
                if (eventType == XMLStreamConstants.START_ELEMENT) {
                    String currentTagName = reader.getLocalName();
                    System.out.println("获取到的下一个标签: " + currentTagName);
                    
                    // 如果需要读取标签的属性,比如employee的name和empId
                    if ("employee".equals(currentTagName)) {
                        String empName = reader.getAttributeValue(null, "name");
                        String empId = reader.getAttributeValue(null, "empId");
                        System.out.println("  员工信息: 姓名=" + empName + ", 工号=" + empId);
                    }
                }
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码说明:

  • reader.hasNext():判断是否还有下一个XML节点可以读取
  • reader.next():移动到下一个节点,并返回当前节点的类型(开始标签、结束标签、文本等)
  • XMLStreamConstants.START_ELEMENT:筛选出开始标签事件,这样就能精准获取到每个标签的名称
  • 还可以通过reader.getAttributeValue()轻松读取标签的属性值

方法二:用SAX解析——事件驱动自动推送

SAX是推模式的解析器,解析器会自动遍历XML文档,每遇到一个开始标签就触发对应的事件,你只需要重写事件处理方法就能获取到每个标签。

代码示例:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.StringReader;

public class SAXXmlReader {
    public static void main(String[] args) {
        String xmlContent = "<company>" +
                "<employee name = \"abc\" empId = \"100\" location = \"goa\" dept = \"IT\" />" +
                "<facilities transport=\"Y\" mealcard = \"\" driver = \"Y\"/>" +
                "<reportees manager = \"XXX\" lead = \"XXX\" VP = \"XXX\"/>" +
                "<employee name = \"XYZ\" empId = \"101\" location = \"mombai\" dept = \"IT\" />" +
                "</company>";

        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            // 自定义SAX处理器,重写startElement方法处理开始标签
            DefaultHandler handler = new DefaultHandler() {
                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    // qName就是当前触发的标签名称
                    System.out.println("获取到的下一个标签: " + qName);
                    
                    // 处理employee标签的属性
                    if ("employee".equals(qName)) {
                        String empName = attributes.getValue("name");
                        String empId = attributes.getValue("empId");
                        System.out.println("  员工信息: 姓名=" + empName + ", 工号=" + empId);
                    }
                }
            };

            saxParser.parse(new StringReader(xmlContent), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码说明:

  • 继承DefaultHandler并重写startElement方法,解析器每遇到一个开始标签就会调用这个方法
  • qName参数就是当前标签的名称,attributes参数可以获取标签的所有属性
  • SAX解析内存占用极低,非常适合处理超大XML文件

额外小贴士

  • 如果是读取本地XML文件,只需要把StringReader换成FileReader或者FileInputStream即可
  • 如果你的XML有命名空间,记得用localName代替qName来获取标签名,避免带上命名空间前缀

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:29