Java XML解析

解析 XML 文件是一项常见的任务,通常用于处理配置文件、数据交换等场景。以下是几种常用的 XML 解析方法及其特点:

1. ​DOM 解析

DOM(Document Object Model)将整个 XML 文档加载到内存中,形成树状结构,便于随机访问和修改。适合处理小型 XML 文件。

  • 优点:操作简单,支持随机访问。
  • 缺点:占用内存较大,不适合处理大型文件。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;

public class DOMExample {
    public static void main(String[] args) {
        try {
            File xmlFile = new File("person.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            doc.getDocumentElement().normalize();
            System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
            NodeList nList = doc.getElementsByTagName("name");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    System.out.println("Name: " + eElement.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. ​SAX 解析

SAX(Simple API for XML)是一种基于事件的解析器,逐行读取 XML 文件,适合处理大型文件。

  • 优点:内存占用小,解析速度快。
  • 缺点:只能顺序访问,不支持随机访问。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;

public class SAXExample {
    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            DefaultHandler handler = new DefaultHandler() {
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    System.out.println("Start Element: " + qName);
                }
            };
            saxParser.parse(new File("person.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. ​JAXB 解析

JAXB(Java Architecture for XML Binding)用于将 XML 数据绑定到 Java 对象,适合处理结构化数据。

  • 优点:自动映射,简化代码。
  • 缺点:需要提前定义 Java 类。
import javax.xml.bind.*;
import java.io.StringReader;

public class JAXBExample {
    public static void main(String[] args) {
        String xmlData = "<?xml version='1.0' encoding='UTF-8'?><person><name>John Doe</name><age>30</age></person>";
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Person person = (Person) jaxbUnmarshaller.unmarshal(new StringReader(xmlData));
            System.out.println(person.getName());
            System.out.println(person.getAge());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

4. ​StAX 解析

StAX(Streaming API for XML)结合了 DOM 和 SAX 的优点,支持流式读取和写入。

  • 优点:内存效率高,灵活性好。
  • 缺点:代码复杂度较高。
import javax.xml.stream.*;
import java.io.FileInputStream;

public class StAXExample {
    public static void main(String[] args) {
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("person.xml"));
            while (reader.hasNext()) {
                int event = reader.next();
                if (event == XMLStreamConstants.START_ELEMENT) {
                    System.out.println("Start Element: " + reader.getLocalName());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. ​第三方库(如 DOM4J、XStream)​

  • DOM4J:提供了更简洁的 API,适合复杂的 XML 操作。
  • XStream:支持将 Java 对象与 XML 互相转换,适合序列化和反序列化。

总结

  • 对于小型 XML 文件,推荐使用 ​DOM 或 ​JAXB
  • 对于大型 XML 文件,推荐使用 ​SAX 或 ​StAX
  • 如果需要灵活的对象映射,可以使用 ​XStream 或 ​DOM4J

 

posted @ 2025-03-15 21:20  IT王师傅  阅读(60)  评论(0)    收藏  举报