杰瑞科技汇

Java如何高效解析String中的XML数据?

Java 解析 String XML 的方法

在 Java 中解析存储在 String 中的 XML 数据,有多种方法可以实现,以下是几种常用的方法:

Java如何高效解析String中的XML数据?-图1
(图片来源网络,侵删)

使用 DOM 解析器

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

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;
public class DomParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new InputSource(new StringReader(xmlString)));
            document.getDocumentElement().normalize();
            NodeList nodeList = document.getElementsByTagName("person");
            for (int i = 0; i < nodeList.getLength(); i++) {
                Element element = (Element) nodeList.item(i);
                String name = element.getElementsByTagName("name").item(0).getTextContent();
                String age = element.getElementsByTagName("age").item(0).getTextContent();
                System.out.println("Name: " + name);
                System.out.println("Age: " + age);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 SAX 解析器

SAX 解析器是事件驱动的,逐行读取 XML 文档,适合处理大文件。

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.StringReader;
public class SaxParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            DefaultHandler handler = new DefaultHandler() {
                boolean name = false;
                boolean age = false;
                @Override
                public void startElement(String uri, String localName, 
                        String qName, Attributes attributes) throws SAXException {
                    if (qName.equalsIgnoreCase("name")) {
                        name = true;
                    }
                    if (qName.equalsIgnoreCase("age")) {
                        age = true;
                    }
                }
                @Override
                public void characters(char[] ch, int start, int length) throws SAXException {
                    if (name) {
                        System.out.println("Name: " + new String(ch, start, length));
                        name = false;
                    }
                    if (age) {
                        System.out.println("Age: " + new String(ch, start, length));
                        age = false;
                    }
                }
            };
            saxParser.parse(new InputSource(new StringReader(xmlString)), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 JAXB (Java Architecture for XML Binding)

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

首先定义 Java 类:

Java如何高效解析String中的XML数据?-图2
(图片来源网络,侵删)
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
    private String name;
    private int age;
    @XmlElement
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlElement
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

然后解析 XML:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class JaxbParserExample {
    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();
        }
    }
}

使用 StAX (Streaming API for XML)

StAX 提供了基于游标的 API,介于 DOM 和 SAX 之间。

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.XMLEvent;
import java.io.StringReader;
public class StaxParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader eventReader = factory.createXMLEventReader(new StringReader(xmlString));
            String name = null;
            String age = null;
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                if (event.isStartElement()) {
                    String elementName = event.asStartElement().getName().getLocalPart();
                    if (elementName.equals("name")) {
                        name = eventReader.nextEvent().asCharacters().getData();
                    } else if (elementName.equals("age")) {
                        age = eventReader.nextEvent().asCharacters().getData();
                    }
                }
            }
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

选择哪种方法?

  • DOM: 适合小型 XML 文档,需要频繁访问和修改数据
  • SAX: 适合大型 XML 文档,内存占用小,但只能顺序读取
  • JAXB: 适合需要将 XML 直接映射到 Java 对象的场景
  • StAX: 介于 DOM 和 SAX 之间,提供了更好的控制且内存效率较高

根据你的具体需求选择合适的解析方法。

Java如何高效解析String中的XML数据?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇