杰瑞科技汇

Java如何读取XML文件内容?

Java 读取XML文件内容的方法

在Java中,有几种常见的方法可以读取XML文件内容,以下是几种主流的实现方式:

Java如何读取XML文件内容?-图1
(图片来源网络,侵删)

使用DOM解析器

DOM解析器将整个XML文档加载到内存中,形成树形结构,适合小型XML文件。

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
public class DomParserExample {
    public static void main(String[] args) {
        try {
            // 创建DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析XML文件
            Document document = builder.parse(new File("example.xml"));
            // 获取根元素
            Element root = document.getDocumentElement();
            System.out.println("Root element: " + root.getNodeName());
            // 获取所有子节点
            NodeList nodeList = root.getChildNodes();
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    System.out.println("Element: " + element.getNodeName());
                    System.out.println("Value: " + element.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用SAX解析器

SAX解析器是事件驱动的,适合处理大型XML文件,因为它不会将整个文档加载到内存中。

import org.xml.sax.*;
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 saxParser = factory.newSAXParser();
            DefaultHandler handler = new DefaultHandler() {
                boolean inElement = false;
                @Override
                public void startElement(String uri, String localName, 
                                       String qName, Attributes attributes) {
                    System.out.println("Start element: " + qName);
                    inElement = true;
                }
                @Override
                public void endElement(String uri, String localName, String qName) {
                    System.out.println("End element: " + qName);
                    inElement = false;
                }
                @Override
                public void characters(char[] ch, int start, int length) {
                    if (inElement) {
                        System.out.println("Value: " + new String(ch, start, length));
                    }
                }
            };
            saxParser.parse(new File("example.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用JAXB (Java Architecture for XML Binding)

JAXB可以将XML数据直接映射到Java对象。

首先定义与XML对应的Java类:

Java如何读取XML文件内容?-图2
(图片来源网络,侵删)
import javax.xml.bind.annotation.*;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
    private String title;
    private String author;
    private double price;
    // getters and setters
}

然后使用JAXB解析:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.File;
public class JaxbExample {
    public static void main(String[] args) {
        try {
            JAXBContext context = JAXBContext.newInstance(Book.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Book book = (Book) unmarshaller.unmarshal(new File("book.xml"));
            System.out.println("Title: " + book.getTitle());
            System.out.println("Author: " + book.getAuthor());
            System.out.println("Price: " + book.getPrice());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用StAX (Streaming API for XML)

StAX是一种流式XML解析API,介于DOM和SAX之间。

import javax.xml.stream.*;
import java.io.FileReader;
public class StaxExample {
    public static void main(String[] args) {
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader eventReader = factory.createXMLEventReader(new FileReader("example.xml"));
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                if (event.isStartElement()) {
                    String elementName = event.asStartElement().getName().getLocalPart();
                    System.out.println("Start element: " + elementName);
                } else if (event.isEndElement()) {
                    String elementName = event.asEndElement().getName().getLocalPart();
                    System.out.println("End element: " + elementName);
                } else if (event.isCharacters()) {
                    String text = event.asCharacters().getData().trim();
                    if (!text.isEmpty()) {
                        System.out.println("Value: " + text);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用第三方库(如DOM4J)

DOM4J是一个功能强大的第三方XML处理库:

import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.File;
public class Dom4jExample {
    public static void main(String[] args) {
        try {
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("example.xml"));
            Element root = document.getRootElement();
            System.out.println("Root element: " + root.getName());
            for (Iterator<Element> it = root.elementIterator(); it.hasNext(); ) {
                Element element = it.next();
                System.out.println("Element: " + element.getName());
                System.out.println("Value: " + element.getText());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
解析方式 优点 缺点 适用场景
DOM 简单易用,可随机访问 内存占用大 小型XML文件
SAX 内存占用小,速度快 只能顺序访问,编程复杂 大型XML文件
JAXB 自动映射到Java对象 需要定义Java类 需要将XML转换为Java对象
StAX 内存效率高,可读写 比SAX复杂 需要流式处理XML
DOM4J 功能强大,易用 需要额外依赖 复杂XML处理

选择哪种方法取决于你的具体需求,如XML文件大小、性能要求以及是否需要将XML映射到Java对象等。

分享:
扫描分享到社交APP
上一篇
下一篇