杰瑞科技汇

Java如何解析XML字符串?

在Java中解析XML字符串

在Java中解析XML字符串有几种常见的方法,下面我将介绍三种主要的方式:DOM、SAX和StAX。

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

使用DOM解析器

DOM(Document Object Model)将整个XML文档加载到内存中,形成一个树形结构,便于随机访问。

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class DomParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            // 创建DocumentBuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 将字符串转换为输入流
            InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
            // 解析XML
            Document document = builder.parse(inputStream);
            // 获取根元素
            Element root = document.getDocumentElement();
            System.out.println("Root element: " + root.getNodeName());
            // 获取person元素
            NodeList personList = root.getElementsByTagName("person");
            Node personNode = personList.item(0);
            if (personNode.getNodeType() == Node.ELEMENT_NODE) {
                Element personElement = (Element) personNode;
                // 获取name元素
                NodeList nameList = personElement.getElementsByTagName("name");
                Element nameElement = (Element) nameList.item(0);
                String name = nameElement.getTextContent();
                // 获取age元素
                NodeList ageList = personElement.getElementsByTagName("age");
                Element ageElement = (Element) ageList.item(0);
                String age = ageElement.getTextContent();
                System.out.println("Name: " + name);
                System.out.println("Age: " + age);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用SAX解析器

SAX(Simple API for XML)是事件驱动的解析器,它逐行读取XML文档,触发相应的事件。

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import java.io.*;
public class SaxParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            // 创建SAX解析器
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            // 创建自定义的Handler
            DefaultHandler handler = new DefaultHandler() {
                boolean inName = false;
                boolean inAge = false;
                @Override
                public void startElement(String uri, String localName, 
                                       String qName, Attributes attributes) {
                    if (qName.equalsIgnoreCase("name")) {
                        inName = true;
                    }
                    if (qName.equalsIgnoreCase("age")) {
                        inAge = true;
                    }
                }
                @Override
                public void characters(char[] ch, int start, int length) {
                    if (inName) {
                        System.out.println("Name: " + new String(ch, start, length));
                        inName = false;
                    }
                    if (inAge) {
                        System.out.println("Age: " + new String(ch, start, length));
                        inAge = false;
                    }
                }
            };
            // 解析XML
            InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
            saxParser.parse(inputStream, handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用StAX解析器

StAX(Streaming API for XML)是Java 6引入的API,提供了类似SAX的流式处理,但允许应用程序控制解析过程。

import javax.xml.stream.*;
import java.io.*;
public class StaxParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            // 创建XMLInputFactory
            XMLInputFactory factory = XMLInputFactory.newInstance();
            // 创建XMLEventReader
            InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
            XMLEventReader eventReader = factory.createXMLEventReader(inputStream);
            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();
        }
    }
}

使用第三方库(如JDOM或DOM4J)

除了Java内置的XML解析器,还可以使用第三方库如JDOM或DOM4J,它们提供了更简洁的API。

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

使用JDOM示例

import org.jdom2.*;
import org.jdom2.input.*;
import java.io.*;
public class JdomParserExample {
    public static void main(String[] args) {
        String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
        try {
            // 创建SAXBuilder
            SAXBuilder builder = new SAXBuilder();
            // 从字符串构建Document
            Document document = builder.build(new StringReader(xmlString));
            // 获取根元素
            Element root = document.getRootElement();
            // 获取person元素
            Element person = root.getChild("person");
            // 获取name和age
            String name = person.getChildText("name");
            String age = person.getChildText("age");
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

选择哪种方法?

  • DOM:适合小型XML文档,需要随机访问或多次处理数据
  • SAX:适合大型XML文档,内存占用小,但只能顺序处理
  • StAX:介于DOM和SAX之间,提供了更好的控制
  • JDOM/DOM4J:提供了更简洁的API,开发效率更高

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

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