在Java开发中,处理XML或HTML文档时,提取子标签是一项常见的需求,无论是解析配置文件、爬取网页数据,还是处理结构化文档,掌握如何高效、准确地获取子标签都是必备技能,本文将详细介绍Java中获取子标签的多种方法,涵盖DOM、SAX、JDOM、DOM4J等主流技术,并结合代码示例说明不同场景下的最佳实践。

使用DOM解析器获取子标签
DOM(Document Object Model)是W3C组织推荐的处理XML/HTML的标准接口,它将整个文档加载到内存中,构建一棵树形结构,开发者可以通过节点遍历轻松获取子标签。
基本步骤
首先需要通过DocumentBuilderFactory创建DocumentBuilder,然后解析输入流(如文件、字符串)得到Document对象,Document对象代表整个文档,其getDocumentElement()方法返回根元素,再通过getChildNodes()或getElementsByTagName()等方法获取子标签。
代码示例
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
public class DomParserExample {
public static void main(String[] args) throws Exception {
String xml = "<root><child1>Text1</child1><child2>Text2</child2></root>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
// 获取所有child节点
NodeList children = document.getDocumentElement().getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
if (children.item(i).getNodeName().equals("child1")) {
System.out.println("Child1 content: " + children.item(i).getTextContent());
}
}
}
}
优缺点分析
DOM的优点是直观易用,支持随机访问和修改节点;缺点是内存消耗大,不适合处理大型文档。
使用SAX解析器获取子标签
SAX(Simple API for XML)是一种事件驱动的解析方式,它逐行读取文档,遇到标签开始、结束等事件时触发回调方法,内存占用小,适合处理大文件,但只能顺序访问。
核心接口
需要继承DefaultHandler类,重写startElement、endElement、characters等方法,在startElement方法中可以通过Attributes参数获取标签属性,在characters方法中获取标签内容。

代码示例
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.ByteArrayInputStream;
public class SaxParserExample {
public static void main(String[] args) throws Exception {
String xml = "<root><child1>Text1</child1><child2>Text2</child2></root>";
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean inChild1 = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
if (qName.equals("child1")) {
inChild1 = true;
}
}
@Override
public void characters(char[] ch, int start, int length) {
if (inChild1) {
System.out.println("Child1 content: " + new String(ch, start, length));
inChild1 = false;
}
}
};
parser.parse(new ByteArrayInputStream(xml.getBytes()), handler);
}
}
适用场景
SAX适合只读或流式处理大型XML文件,但不支持随机访问和节点修改。
使用JDOM获取子标签
JDOM是一个开源项目,专门为Java设计,比DOM更易用,比SAX更直观,它结合了DOM的树形结构和SAX的内存效率。
基本用法
通过SAXBuilder或DOMBuilder构建Document对象,然后使用getChild()、getChildren()等方法获取子标签。
代码示例
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import java.io.ByteArrayInputStream;
import java.util.List;
public class JdomExample {
public static void main(String[] args) throws Exception {
String xml = "<root><child1>Text1</child1><child2>Text2</child2></root>";
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new ByteArrayInputStream(xml.getBytes()));
Element root = document.getRootElement();
List<Element> children = root.getChildren();
for (Element child : children) {
if (child.getName().equals("child1")) {
System.out.println("Child1 content: " + child.getText());
}
}
}
}
特点
JDOM提供了更简洁的API,支持直接操作List集合获取子元素,代码可读性高。
使用DOM4J获取子标签
DOM4J是另一个优秀的Java XML处理库,性能优异,功能强大,支持XPath、XML Schema等高级特性。

核心API
通过SAXReader读取XML文档,得到Document对象后,使用element.elements()获取子元素列表,或使用element.element(“childName”)获取指定名称的子元素。
代码示例
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.ByteArrayInputStream;
import java.util.List;
public class Dom4jExample {
public static void main(String[] args) throws Exception {
String xml = "<root><child1>Text1</child1><child2>Text2</child2></root>";
SAXReader reader = new SAXReader();
Document document = reader.read(new ByteArrayInputStream(xml.getBytes()));
Element root = document.getRootElement();
List<Element> children = root.elements();
for (Element child : children) {
if (child.getName().equals("child1")) {
System.out.println("Child1 content: " + child.getText());
}
}
}
}
高级功能
DOM4J支持XPath表达式快速定位子节点,如root.element("//child1"),非常适合复杂查询场景。
选择合适的解析方法
- DOM:适合小型文档,需要频繁修改节点结构的场景。
- SAX:适合大型文件,只需顺序读取数据的场景。
- JDOM:追求代码简洁性和易用性时的首选。
- DOM4J:需要高性能和高级功能(如XPath)时的最佳选择。
注意事项
- 处理XML时要注意编码问题,建议统一使用UTF-8。
- 对于HTML文档,建议使用Jsoup库,它专门针对HTML优化,容错性强。
- 在多线程环境下使用解析器时,需确保Document对象的线程安全性。
通过以上介绍,相信开发者已经掌握了Java中获取子标签的多种方法,在实际开发中,应根据项目需求、文档大小和性能要求选择合适的解析方案,以达到最佳的开发效率和运行性能。













