杰瑞科技汇

java 解析xml string

在Java中解析XML字符串

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

java 解析xml string-图1
(图片来源网络,侵删)

使用DOM解析器

DOM解析器将整个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><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            // 创建DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析XML字符串
            Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
            // 获取根元素
            Element rootElement = document.getDocumentElement();
            System.out.println("Root element: " + rootElement.getNodeName());
            // 获取所有person元素
            NodeList nodeList = rootElement.getElementsByTagName("person");
            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("Person ID: " + element.getAttribute("id"));
                    // 获取子元素
                    NodeList childNodes = element.getChildNodes();
                    for (int j = 0; j < childNodes.getLength(); j++) {
                        Node childNode = childNodes.item(j);
                        if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                            System.out.println(childNode.getNodeName() + ": " + childNode.getTextContent());
                        }
                    }
                }
            }
        } 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.ByteArrayInputStream;
public class SaxXmlParser {
    public static void main(String[] args) {
        String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            DefaultHandler handler = new DefaultHandler() {
                boolean inName = false;
                boolean inAge = false;
                @Override
                public void startElement(String uri, String localName, 
                                       String qName, Attributes attributes) throws SAXException {
                    if (qName.equalsIgnoreCase("person")) {
                        System.out.println("Person ID: " + attributes.getValue("id"));
                    }
                    if (qName.equalsIgnoreCase("name")) {
                        inName = true;
                    }
                    if (qName.equalsIgnoreCase("age")) {
                        inAge = true;
                    }
                }
                @Override
                public void characters(char[] ch, int start, int length) throws SAXException {
                    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;
                    }
                }
            };
            saxParser.parse(new ByteArrayInputStream(xmlString.getBytes()), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用StAX解析器

StAX (Streaming API for XML) 提供了基于游标的读写API,结合了DOM的易用性和SAX的性能。

import javax.xml.stream.*;
import java.io.ByteArrayInputStream;
public class StaxXmlParser {
    public static void main(String[] args) {
        String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader eventReader = factory.createXMLEventReader(
                new ByteArrayInputStream(xmlString.getBytes()));
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                if (event.isStartElement()) {
                    String elementName = event.asStartElement().getName().getLocalPart();
                    if (elementName.equals("person")) {
                        System.out.println("Person ID: " + 
                            event.asStartElement().getAttributeByName(null, "id").getValue());
                    }
                    if (elementName.equals("name") || elementName.equals("age")) {
                        event = eventReader.nextEvent();
                        System.out.println(elementName + ": " + event.asCharacters().getData());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

这些库提供了更简洁的API:

java 解析xml string-图2
(图片来源网络,侵删)

JDOM示例

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class JdomXmlParser {
    public static void main(String[] args) {
        String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            SAXBuilder builder = new SAXBuilder();
            Document document = builder.build(new ByteArrayInputStream(xmlString.getBytes()));
            Element rootElement = document.getRootElement();
            System.out.println("Root element: " + rootElement.getName());
            for (Element person : rootElement.getChildren("person")) {
                System.out.println("Person ID: " + person.getAttributeValue("id"));
                System.out.println("Name: " + person.getChildText("name"));
                System.out.println("Age: " + person.getChildText("age"));
            }
        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
    }
}

DOM4J示例

import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.ByteArrayInputStream;
public class Dom4jXmlParser {
    public static void main(String[] args) {
        String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            SAXReader reader = new SAXReader();
            Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes()));
            Element rootElement = document.getRootElement();
            System.out.println("Root element: " + rootElement.getName());
            for (Element person : rootElement.elements("person")) {
                System.out.println("Person ID: " + person.attributeValue("id"));
                System.out.println("Name: " + person.elementText("name"));
                System.out.println("Age: " + person.elementText("age"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

选择建议

  • DOM:适合小型XML文档,需要频繁访问或修改文档结构
  • SAX:适合大型XML文档,内存占用少,但只能顺序读取
  • StAX:介于DOM和SAX之间,适合需要平衡性能和易用性的场景
  • JDOM/DOM4J:提供了更简洁的API,适合快速开发

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

java 解析xml string-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇