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

