java如何读取xml文件
使用DOM解析XML
DOM(Document Object Model)是一种基于树结构的解析方式,适合处理较小的XML文件。通过javax.xml.parsers.DocumentBuilder类加载XML文件并生成Document对象,之后可以通过节点遍历获取数据。

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class DomParserExample {
public static void main(String[] args) {
try {
File file = new File("example.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(file);
NodeList nodeList = document.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
System.out.println("Title: " + element.getElementsByTagName("title").item(0).getTextContent());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX解析XML
SAX(Simple API for XML)是一种基于事件驱动的解析方式,适合处理大型XML文件。通过继承org.xml.sax.helpers.DefaultHandler类并重写方法实现自定义解析逻辑。

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.File;
public class SaxParserExample {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File("example.xml"), new DefaultHandler() {
boolean isTitle = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) {
if (qName.equalsIgnoreCase("title")) {
isTitle = true;
}
}
@Override
public void characters(char[] ch, int start, int length) {
if (isTitle) {
System.out.println("Title: " + new String(ch, start, length));
isTitle = false;
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用StAX解析XML
StAX(Streaming API for XML)是一种拉模式解析方式,结合了DOM和SAX的优点。通过javax.xml.stream.XMLStreamReader逐行读取XML内容。
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;
public class StaxParserExample {
public static void main(String[] args) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("example.xml"));
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamReader.START_ELEMENT && reader.getLocalName().equals("title")) {
System.out.println("Title: " + reader.getElementText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用JAXB解析XML
JAXB(Java Architecture for XML Binding)通过注解将XML映射为Java对象,适合结构化数据绑定。需提前定义与XML结构对应的Java类并使用javax.xml.bind.JAXBContext进行绑定。
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.File;
public class JaxbParserExample {
public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(Bookstore.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Bookstore bookstore = (Bookstore) unmarshaller.unmarshal(new File("example.xml"));
for (Book book : bookstore.getBooks()) {
System.out.println("Title: " + book.getTitle());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
选择解析方式的建议
- DOM:适用于小型XML文件,需频繁修改或随机访问节点。
- SAX:适用于大型XML文件,内存占用低但只能单向解析。
- StAX:平衡内存和灵活性,支持双向解析。
- JAXB:适合结构化数据绑定,需提前定义Java类。
根据实际需求选择合适的方法,若需高性能优先考虑SAX或StAX,若需便捷性可选JAXB。






