杰瑞科技汇

Java XML转String有哪些方法?

使用 javax.xml.transform (最推荐、最灵活)

这是 Java 标准库中官方推荐的方法,它不依赖于任何具体的 XML 解析器(如 DOM 或 SAX),非常灵活,可以处理格式化、输出到文件等多种场景。

Java XML转String有哪些方法?-图1
(图片来源网络,侵删)

核心思想:

  1. 创建一个 TransformerFactory 实例。
  2. 通过工厂创建一个 Transformer 实例。
  3. 创建一个 DOMSource(如果已有 DOM 树)或 SAXSource(如果已有 SAX 解析器)作为源。
  4. 创建一个 StreamResult,并指定目标是一个 StringWriter
  5. 调用 transformer.transform() 方法进行转换。

示例代码

这个例子展示了如何从一个 XML 字符串创建一个 DOM 文档,然后再将其转换回格式化的字符串。

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 XmlToStringTransformer {
    public static void main(String[] args) {
        String xmlString = "<root><user><name>张三</name><age>30</age></user><user><name>李四</name><age>25</age></user></root>";
        try {
            // 1. 将 XML 字符串解析为 Document 对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new java.io.ByteArrayInputStream(xmlString.getBytes("UTF-8")));
            // 2. 创建 Transformer 实例
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            // 3. 设置输出属性 (可选,但强烈推荐)
            //   - indent: 是否进行缩进,使输出更易读
            //   - omit-xml-declaration: 是否省略 XML 声明 <?xml version="1.0" encoding="UTF-8" ?>
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            // 4. 创建源 (Source) 和目标 (Result)
            DOMSource source = new DOMSource(doc);
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            // 5. 执行转换
            transformer.transform(source, result);
            // 6. 从 StringWriter 中获取结果
            String prettyXmlString = writer.toString();
            System.out.println("格式化后的 XML 字符串:");
            System.out.println(prettyXmlString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果:

格式化后的 XML 字符串:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <user>
        <name>张三</name>
        <age>30</age>
    </user>
    <user>
        <name>李四</name>
        <age>25</age>
    </user>
</root>

使用 org.w3c.dom.NodegetTextContent() 方法

如果你已经有一个 DOM 树,并且只需要获取某个节点及其所有子节点的文本内容(不包含标签本身),可以使用 getTextContent(),这个方法不适合获取完整的 XML 结构。

Java XML转String有哪些方法?-图2
(图片来源网络,侵删)

适用场景: 提取特定元素的文本值,而不是整个 XML 文档。

示例代码

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class XmlNodeTextContent {
    public static void main(String[] args) {
        String xmlString = "<root><user><name>张三</name><age>30</age></user><user><name>李四</name><age>25</age></user></root>";
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new java.io.ByteArrayInputStream(xmlString.getBytes("UTF-8")));
            // 获取所有 <name> 节点
            NodeList nameNodes = doc.getElementsByTagName("name");
            for (int i = 0; i < nameNodes.getLength(); i++) {
                // 获取节点的文本内容
                String name = nameNodes.item(i).getTextContent();
                System.out.println("找到用户名: " + name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果:

找到用户名: 张三
找到用户名: 李四

直接拼接字符串 (不推荐)

对于非常简单、结构固定的 XML,你可以手动拼接字符串。但这种方法极其脆弱,不适用于任何生产环境,因为:

  • 容易出错:引号、特殊字符处理非常麻烦。
  • 难以维护:XML 结构变化时,代码需要大量修改。
  • 不安全:无法防止 XML 注入等安全问题。

示例代码(仅作演示,切勿在生产环境使用)

public class ManualXmlString {
    public static void main(String[] args) {
        String name = "张三";
        int age = 30;
        String escapedName = name.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;").replace("'", "&apos;");
        String xmlString = "<user><name>" + escapedName + "</name><age>" + age + "</age></user>";
        System.out.println(xmlString);
    }
}

输出结果:

<user><name>张三</name><age>30</age></user>

使用第三方库 (如 Jackson 或 Gson)

如果你已经在使用 Jackson 或 Gson 进行 JSON 处理,它们也提供了处理 XML 的功能,通常非常简洁。

示例代码 (使用 Jackson)

你需要添加 Jackson 的 XML 模块依赖:

<!-- Maven -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;
public class JacksonXmlToString {
    public static void main(String[] args) {
        // 1. 创建 XmlMapper 实例
        XmlMapper xmlMapper = new XmlMapper();
        // 2. 准备一个 Java 对象 (POJO)
        User user = new User("王五", 28);
        try {
            // 3. 直接将对象序列化为 XML 字符串
            String xmlString = xmlMapper.writeValueAsString(user);
            System.out.println("使用 Jackson 生成的 XML:");
            System.out.println(xmlString);
            // 4. 也可以反序列化
            User deserializedUser = xmlMapper.readValue(xmlString, User.class);
            System.out.println("\n反序列化后的对象: " + deserializedUser.getName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 对应的 Java Bean (POJO)
    static class User {
        public String name;
        public int age;
        // Jackson 需要一个无参构造函数
        public User() {}
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public int getAge() { return age; }
        public void setAge(int age) { this.age = age; }
    }
}

输出结果:

使用 Jackson 生成的 XML:
<User><name>王五</name><age>28</age></User>
反序列化后的对象: 王五

总结与选择

方法 优点 缺点 适用场景
javax.xml.transform 官方标准、灵活、功能强大(可格式化)、不依赖特定解析器 代码稍显冗长 通用场景,推荐首选,特别是需要控制输出格式时。
Node.getTextContent() 简单直接,获取文本内容高效 只能获取文本,不能获取完整 XML 结构 当你只需要从 DOM 树中提取特定元素的文本值时。
手动拼接字符串 简单(表面) 极其脆弱、易错、难以维护、不安全 绝对不推荐,仅用于学习或极简单的、非关键的硬编码场景。
第三方库 (Jackson) 代码简洁、与 JSON 处理无缝集成、功能强大 需要引入外部依赖 项目中已使用 Jackson/Gson 等库,希望保持技术栈统一时。

对于在 Java 中将 XML 转换为 String 的需求,最标准、最可靠、最灵活的方法是使用 javax.xml.transform 包。

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