Java XML 字符串解析与操作

简介

在Java开发中,经常会遇到需要解析和操作XML字符串的需求。XML(可扩展标记语言)是一种用于存储和传输数据的格式,它具有自我描述性、可扩展性和易于阅读的特点。本文将介绍如何在Java中解析和操作XML字符串,并提供相应的代码示例。

解析XML字符串

Java提供了许多方法来解析XML字符串,其中最常用的是使用**DOM(文档对象模型)SAX(简单API for XML)**。

使用DOM解析XML字符串

DOM解析器将整个XML文档加载到内存中,并以树形结构表示。它允许我们轻松地遍历和操作XML数据。

首先,我们需要创建一个DocumentBuilderFactory对象,然后使用该对象创建一个DocumentBuilder对象。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

String xmlString = "<root><name>John</name><age>25</age></root>";

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xmlString)));

上述代码创建了一个包含XML字符串的Document对象。现在,我们可以使用Document对象来访问和操作XML数据。

Element root = document.getDocumentElement();
String name = root.getElementsByTagName("name").item(0).getTextContent();
int age = Integer.parseInt(root.getElementsByTagName("age").item(0).getTextContent());

上述代码从根元素开始,通过getElementsByTagName方法获取指定标签名的元素,并使用getTextContent方法获取元素的文本内容。

使用SAX解析XML字符串

SAX解析器是一种基于事件驱动的解析器,它逐行读取XML文档,并在解析的过程中触发相应的事件。相比DOM解析器,SAX解析器更加高效,尤其适用于处理大型XML文档。

首先,我们需要创建一个SAXParserFactory对象,然后使用该对象创建一个SAXParser对象。

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

String xmlString = "<root><name>John</name><age>25</age></root>";

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

接下来,我们需要创建一个继承自DefaultHandler的类,重写相应的方法来处理XML事件。

public class MyHandler extends DefaultHandler {
    boolean isName = false;
    boolean isAge = false;
    String name;
    int age;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equals("name")) {
            isName = true;
        } else if (qName.equals("age")) {
            isAge = true;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (isName) {
            name = new String(ch, start, length);
            isName = false;
        } else if (isAge) {
            age = Integer.parseInt(new String(ch, start, length));
            isAge = false;
        }
    }
}

最后,我们可以使用上述类来解析XML字符串。

MyHandler handler = new MyHandler();
parser.parse(new InputSource(new StringReader(xmlString)), handler);

String name = handler.name;
int age = handler.age;

上述代码通过parse方法将XML字符串解析为事件,并调用相应的事件处理方法来提取XML数据。

操作XML字符串

一旦我们将XML字符串解析为Document对象,就可以轻松地对其进行操作。下面是一些常见的操作示例:

创建XML字符串

我们可以使用DocumentBuilderDocument对象来创建XML字符串。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();

Element root = document.createElement("root");
document.appendChild(root);

Element name = document.createElement("name");
name.appendChild(document.createTextNode("John"));
root.appendChild(name);

Element age = document.createElement("age");
age.appendChild(document.createTextNode("25"));
root.appendChild(age);

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer