杰瑞科技汇

Java XML如何转字符串?

下面我将为你详细介绍几种最主流和推荐的方法。

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

准备工作:一个示例 XML

为了方便演示,我们先定义一个简单的 XML 文件 data.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="FICTION">
        <title lang="en">The Great Gatsby</title>
        <author>F. Scott Fitzgerald</author>
        <year>1925</year>
        <price>10.99</price>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J.K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>

使用标准 Java API (DOM - Document Object Model)

这是最传统、最基础的方法,不需要引入任何第三方库,它通过将整个 XML 文件加载到内存中构建一个树形结构,然后遍历这个树来生成字符串。

步骤:

  1. 创建一个 DocumentBuilderFactoryDocumentBuilder
  2. 使用 DocumentBuilder 解析 XML 文件,得到 Document 对象。
  3. 创建一个 TransformerFactoryTransformer
  4. 设置 Transformer 的输出属性(如是否缩进、编码等)。
  5. 使用 TransformerDocument 对象转换为 String

代码示例:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import java.io.StringWriter;
public class DomToStringConverter {
    public static void main(String[] args) {
        try {
            // 1. 创建 DocumentBuilderFactory 和 DocumentBuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 2. 解析 XML 文件,获取 Document 对象
            // 假设 data.xml 在 classpath 根目录下
            Document document = builder.parse(DomToStringConverter.class.getClassLoader().getResourceAsStream("data.xml"));
            // 3. 创建 TransformerFactory 和 Transformer
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            // 4. 设置输出格式(可选)
            //   - indent: 是否缩进,使 XML 字符串更易读
            //   - encoding: 指定输出编码,如 "UTF-8"
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); // 缩进2个空格
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            // 5. 将 Document 转换为 String
            StringWriter writer = new StringWriter();
            transformer.transform(new DOMSource(document), new StreamResult(writer));
            String xmlString = writer.toString();
            System.out.println(xmlString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点:

  • 是 Java 标准库的一部分,无需额外依赖。
  • 功能强大,可以对 XML 进行任意复杂的查询和修改。

缺点:

Java XML如何转字符串?-图2
(图片来源网络,侵删)
  • 对于大型 XML 文件,会将整个文档加载到内存中,可能导致内存溢出。
  • API 相对繁琐,代码量较多。

使用 JDOM (推荐)

JDOM 是一个专门为 Java 设计的 XML API,它旨在让 XML 处理更简单、更直观,它不是标准库,但非常流行。

步骤:

  1. 添加 JDOM 依赖(Maven)。
  2. 使用 SAXBuilder 解析 XML 文件,得到 Document 对象。
  3. 使用 XMLOutputterDocument 对象格式化为字符串。

添加 Maven 依赖

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom2</artifactId>
    <version>2.0.6.1</version> <!-- 使用最新版本 -->
</dependency>

代码示例

import org.jdom2.Document;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
public class JdomToStringConverter {
    public static void main(String[] args) {
        try {
            // 1. 创建 SAXBuilder
            SAXBuilder saxBuilder = new SAXBuilder();
            // 2. 解析 XML 文件,获取 Document 对象
            // 假设 data.xml 在项目根目录
            Document document = saxBuilder.build(new File("data.xml"));
            // 3. 创建 XMLOutputter 并设置格式
            //   - Format.getPrettyFormat(): 生成格式化、易读的字符串
            //   - Format.getRawFormat(): 生成紧凑的、无缩进的字符串
            XMLOutputter xmlOutputter = new XMLOutputter(Format.getPrettyFormat());
            // 4. 将 Document 转换为 String
            StringWriter writer = new StringWriter();
            xmlOutputter.output(document, writer);
            String xmlString = writer.toString();
            System.out.println(xmlString);
        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
    }
}

优点:

  • API 非常简洁、易用,代码可读性高。
  • 内存效率比标准 DOM 好一些。

缺点:

  • 需要引入第三方库。

使用 Dom4J (推荐)

Dom4J 是另一个非常强大和流行的 Java XML 库,性能优异,功能强大,尤其在处理大型 XML 文件时表现良好。

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

步骤:

  1. 添加 Dom4J 依赖(Maven)。
  2. 使用 SAXReader 解析 XML 文件,得到 Document 对象。
  3. 使用 XMLWriterDocument 对象写入 StringWriter

添加 Maven 依赖

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.4</version> <!-- 使用最新版本 -->
</dependency>

注意: Dom4J 依赖于另一个库 jaxen 来处理 XPath,Maven 会自动下载它。

代码示例

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
public class Dom4jToStringConverter {
    public static void main(String[] args) {
        try {
            // 1. 创建 SAXReader
            SAXReader reader = new SAXReader();
            // 2. 解析 XML 文件,获取 Document 对象
            // 假设 data.xml 在项目根目录
            Document document = reader.read(new File("data.xml"));
            // 3. 创建输出格式
            //   - OutputFormat.createPrettyPrint(): 生成格式化、易读的字符串
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8"); // 设置编码
            // 4. 创建 XMLWriter 和 StringWriter
            StringWriter writer = new StringWriter();
            XMLWriter xmlWriter = new XMLWriter(writer, format);
            // 5. 将 Document 写入 StringWriter
            xmlWriter.write(document);
            xmlWriter.close();
            String xmlString = writer.toString();
            System.out.println(xmlString);
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }
}

优点:

  • 性能非常高,尤其适合处理大型 XML 文件。
  • API 功能强大,支持 XPath、XSLT 等。
  • 代码也比较简洁。

缺点:

  • 需要引入第三方库。

总结与选择

特性 标准 DOM JDOM Dom4J
依赖 无(Java标准库) 第三方 (JDOM2) 第三方 (Dom4J)
易用性 较低,API繁琐 ,API直观 ,API强大
性能 较低,内存占用大 中等 ,性能优异
适用场景 小型XML、无外部依赖项目 快速开发、中小型XML 大型XML、高性能需求、复杂操作

如何选择?

  • 如果你不能引入任何外部库:只能使用标准 DOM,但要记住它可能不适合大文件。
  • 如果你想要一个简单、快速、易用的解决方案JDOM 是一个绝佳的选择,它的 API 非常符合 Java 开发者的习惯。
  • 如果你处理的是大型 XML 文件,或者需要极致的性能和强大的功能(如 XPath)Dom4J 是业界公认的最佳选择之一。

对于大多数现代 Java 项目,我 强烈推荐 JDOM 或 Dom4J,它们能显著简化你的代码并提高开发效率。

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