杰瑞科技汇

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.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DomParser {
    public static void parseXmlString(String xmlString) {
        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("book");
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    String title = element.getElementsByTagName("title").item(0).getTextContent();
                    String author = element.getElementsByTagName("author").item(0).getTextContent();
                    System.out.println("Book Title: " + title);
                    System.out.println("Book Author: " + author);
                }
            }
        } 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 SaxParser {
    public static void parseXmlString(String xmlString) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            DefaultHandler handler = new DefaultHandler() {
                boolean inTitle = false;
                boolean inAuthor = false;
                @Override
                public void startElement(String uri, String localName, 
                        String qName, Attributes attributes) {
                    if (qName.equalsIgnoreCase("title")) {
                        inTitle = true;
                    }
                    if (qName.equalsIgnoreCase("author")) {
                        inAuthor = true;
                    }
                }
                @Override
                public void characters(char[] ch, int start, int length) {
                    if (inTitle) {
                        System.out.println("Book Title: " + new String(ch, start, length));
                        inTitle = false;
                    }
                    if (inAuthor) {
                        System.out.println("Book Author: " + new String(ch, start, length));
                        inAuthor = false;
                    }
                }
            };
            saxParser.parse(new InputSource(new StringReader(xmlString)), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 JAXB (Java Architecture for XML Binding)

JAXB 提供了将 XML 绑定到 Java 对象的功能。

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

Java如何解析String中的XML数据?-图2
(图片来源网络,侵删)
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
public class Library {
    private List<Book> books;
    @XmlElement(name = "book")
    public List<Book> getBooks() {
        return books;
    }
    public void setBooks(List<Book> books) {
        this.books = books;
    }
}
public class Book {
    private String title;
    private String author;
    @XmlElement
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    @XmlElement
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}

然后使用 JAXB 解析:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class JaxbParser {
    public static void parseXmlString(String xmlString) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Library.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Library library = (Library) unmarshaller.unmarshal(new StringReader(xmlString));
            for (Book book : library.getBooks()) {
                System.out.println("Book Title: " + book.getTitle());
                System.out.println("Book Author: " + book.getAuthor());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 StAX (Streaming API for XML)

StAX 提供了类似 SAX 的流式处理,但更易于使用。

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.StringReader;
public class StaxParser {
    public static void parseXmlString(String xmlString) {
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(xmlString));
            String title = null;
            String author = null;
            while (reader.hasNext()) {
                int event = reader.next();
                switch (event) {
                    case XMLStreamConstants.START_ELEMENT:
                        if ("title".equals(reader.getLocalName())) {
                            title = reader.getElementText();
                        } else if ("author".equals(reader.getLocalName())) {
                            author = reader.getElementText();
                        }
                        break;
                    case XMLStreamConstants.END_ELEMENT:
                        if ("book".equals(reader.getLocalName())) {
                            System.out.println("Book Title: " + title);
                            System.out.println("Book Author: " + author);
                            title = null;
                            author = null;
                        }
                        break;
                }
            }
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }
}

示例 XML

解析器可以处理如下格式的 XML:

<library>
    <book>
        <title>Java Programming</title>
        <author>John Doe</author>
    </book>
    <book>
        <title>XML Processing</title>
        <author>Jane Smith</author>
    </book>
</library>

选择建议

  • DOM: 适合小型 XML 文档,需要随机访问节点
  • SAX: 适合大型 XML 文档,内存占用小
  • JAXB: 适合需要将 XML 直接映射到 Java 对象的场景
  • StAX: 介于 SAX 和 DOM 之间,提供更好的控制且内存效率高

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

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