杰瑞科技汇

Java如何高效解析XML字符串?

Java 解析 XML 字符串

在 Java 中解析 XML 字符串有多种方法,以下是几种常见的实现方式:

Java如何高效解析XML字符串?-图1
(图片来源网络,侵删)

使用 DOM 解析器

DOM(Document Object Model)将整个 XML 文档加载到内存中,形成树形结构。

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class DomXmlParser {
    public static void main(String[] args) {
        String xmlString = "<root><name>John</name><age>30</age></root>";
        try {
            // 创建 DocumentBuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析 XML 字符串
            Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
            // 获取根元素
            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.getNodeName() + ": " + element.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 SAX 解析器

SAX(Simple API for XML)是事件驱动的解析器,适合处理大型 XML 文件。

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.ByteArrayInputStream;
public class SaxXmlParser {
    public static void main(String[] args) {
        String xmlString = "<root><name>John</name><age>30</age></root>";
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            XMLReader reader = saxParser.getXMLReader();
            reader.setContentHandler(new CustomHandler());
            reader.parse(new InputSource(new ByteArrayInputStream(xmlString.getBytes())));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class CustomHandler extends DefaultHandler {
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) {
        System.out.println("Start element: " + qName);
    }
    @Override
    public void endElement(String uri, String localName, String qName) {
        System.out.println("End element: " + qName);
    }
    @Override
    public void characters(char[] ch, int start, int length) {
        String content = new String(ch, start, length).trim();
        if (!content.isEmpty()) {
            System.out.println("Content: " + content);
        }
    }
}

使用 JAXB (Java Architecture for XML Binding)

JAXB 可以将 XML 与 Java 对象进行绑定。

首先需要添加 JAXB 依赖(Java 9+ 需要单独添加):

<!-- Maven 依赖 -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.1</version>
</dependency>

然后使用 JAXB 解析:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
// 定义对应的 Java 类
class Person {
    private String name;
    private int age;
    // getters and setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}
public class JaxbXmlParser {
    public static void main(String[] args) {
        String xmlString = "<person><name>John</name><age>30</age></person>";
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Person person = (Person) unmarshaller.unmarshal(new StringReader(xmlString));
            System.out.println("Name: " + person.getName());
            System.out.println("Age: " + person.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用第三方库(如 Jackson 或 Gson)

使用 Jackson

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.StringReader;
public class JacksonXmlParser {
    public static void main(String[] args) {
        String xmlString = "<person><name>John</name><age>30</age></person>";
        try {
            XmlMapper xmlMapper = new XmlMapper();
            Person person = xmlMapper.readValue(xmlString, Person.class);
            System.out.println("Name: " + person.getName());
            System.out.println("Age: " + person.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 需要添加 Jackson XML 模块依赖
    }
}

使用 Gson

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.StringReader;
public class GsonXmlParser {
    public static void main(String[] args) {
        String xmlString = "<person><name>John</name><age>30</age></person>";
        try {
            JsonReader reader = new JsonReader(new StringReader(xmlString));
            reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                if (name.equals("name")) {
                    System.out.println("Name: " + reader.nextString());
                } else if (name.equals("age")) {
                    System.out.println("Age: " + reader.nextInt());
                } else {
                    reader.skipValue();
                }
            }
            reader.endObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 需要添加 Gson 依赖
    }
}
  • DOM:适合小型 XML 文档,内存占用大但操作灵活
  • SAX:适合大型 XML 文档,内存占用小但只能顺序读取
  • JAXB:适合将 XML 与 Java 对象映射,代码简洁
  • 第三方库:如 Jackson、Gson 等,提供了更灵活的解析方式

选择哪种方法取决于你的具体需求,如 XML 文件大小、性能要求和代码简洁性等。

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