在 Java 中解析 XML 并获取标签属性值有多种实现方式。以下将介绍三种常用的方式:DOM 解析、SAX 解析和使用第三方库(例如,JAXB)。
DOM(Document Object Model)解析器会将整个 XML 文档加载到内存中,并创建一个树形结构,使您可以通过访问节点来检索和修改 XML 数据。
步骤流程:
示例代码:
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class DOMParserExample {
public static void main(String[] args) {
try {
File xmlFile = new File("example.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlFile);
Element root = document.getDocumentElement();
NodeList nodeList = root.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element book = (Element) nodeList.item(i);
String title = book.getAttribute("title");
System.out.println("Title: " + title);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SAX(Simple API for XML)解析器是一种事件驱动的解析方式,它在解析 XML 文件时逐行读取,不会将整个文档加载到内存中。
步骤流程:
示例代码:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import java.io.*;
public class SAXParserExample {
public static void main(String[] args) {
try {
File xmlFile = new File("example.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("book")) {
String title = attributes.getValue("title");
System.out.println("Title: " + title);
}
}
};
parser.parse(xmlFile, handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
JAXB 是 Java 提供的用于将 XML 数据绑定到 Java 对象的技术,通过注解可以轻松地将 XML 格式转换为 Java 对象。
步骤流程:
示例代码:
import javax.xml.bind.*;
import java.io.*;
@XmlRootElement
class Book {
@XmlAttribute
String title;
public String getTitle() {
return title;
}
}
public class JAXBExample {
public static void main(String[] args) {
try {
File xmlFile = new File("example.xml");
JAXBContext context = JAXBContext.newInstance(Book.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Book book = (Book) unmarshaller.unmarshal(xmlFile);
String title = book.getTitle();
System.out.println("Title: " + title);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Maven 和 Gradle 依赖坐标:
<dependency>
<groupId>org.w3c.dom</groupId>
<artifactId>org.w3c.dom</artifactId>
<version>1.0.1</version>
</dependency>
implementation 'org.w3c.dom:org.w3c.dom:1.0.1'
<dependency>
<groupId>org.xml.sax</groupId>
<artifactId>org.xml.sax</artifactId>
<version>2.2.1</version>
</dependency>
implementation 'org.xml.sax:org.xml.sax:2.2.1'
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
请注意,以上示例代码和依赖坐标中的版本号可能会随着时间的推移而有所更改。确保使用最新的版本,可以从相应的仓库或官方网站获取更新的信息。