1. 概述

在某些场景下,我们需要将 XML(可扩展标记语言)字符串转换为可处理的实际 XML 文档。这种情况在网络爬虫或从数据库获取存储的 XML 数据等任务中较为常见。

本文将讨论如何将 XML 字符串转换为 XML 文档,并提供两种不同的实现方法。

2. 示例字符串

我们将使用一个包含博客文章数据的简单 XML 文档:

<posts>
    <post postId="1">
        <title>在 Java 中解析 XML 字符串</title>
        <author>John Doe</author>
    </post>
</posts>

posts 是根元素,包含一个或多个 post 子元素。

3. 从字符串解析 XML

本节将介绍两种从示例字符串解析 XML 的方法。

3.1. 使用 InputSource 和 StringReader

解析 XML 文档时,我们需要构建一个 DocumentBuilder 类的实例,然后在该实例上调用 parse 方法。该方法需要一个输入源来解析 XML。

由于我们的 XML 是字符串形式,如果直接将字符串传递给 parse 方法,会抛出异常。这是因为 parse 方法期望字符串是一个指向 XML 资源的 URI(统一资源标识符)。

幸运的是,我们可以为 XML 字符串创建自定义输入源。我们可以使用 StringReader 类从 XML 字符串创建字符流,然后基于该流创建新的输入源:

String xmlString = "<posts>...</posts>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource inputSource = new InputSource(new StringReader(xmlString));
Document document = builder.parse(inputSource);

让我们分解一下这段代码:

  • xmlString 是我们的示例 XML 字符串
  • DocumentBuilder 是一个辅助类,用于解析和创建 XML 文档
  • InputSource 是一个包装器,可以从文件、字符串、流等各种来源消费 XML 数据
  • StringReader 将 XML 字符串转换为可读的字符流

本质上,InputSource 可以接受一个 Reader 对象并将其作为 XML 进行解析:

public InputSource(Reader characterStream)

类似地,parse 方法接受一个 InputSource

public Document parse(InputSource is)

最终,parse 方法会从字符串创建 XML 文档。我们可以通过将示例文档作为字符串传递来测试:

@Test
public void givenXmlString_whenConvertToDocument_thenSuccess() {
    ...
    assertNotNull(document);
    assertEquals("posts", document.getDocumentElement().getNodeName());
    Element rootElement = document.getDocumentElement();
    var childElements = rootElement.getElementsByTagName("post");
    assertNotNull(childElements);
    assertEquals(1, childElements.getLength());
}

如果 XML 字符串是有效的标记,测试应该能够通过。

3.2. 使用字节数组的 InputStream

使用 InputStream 是解析 XML 的另一种常见方法。当我们需要从网络流或文件流等流中解析 XML 时,这种方法特别有用。此外,它比 InputSource 更简单,后者允许我们微调解析过程。

首先,我们从 XML 字符串创建一个 ByteArrayInputStream 实例,然后将其提供给 parse 方法:

InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8));
Document document = builder.parse(inputStream);

在这段代码中,我们将字符串转换为字节数组,并指定了字符编码(本例中为 UTF-8)。

4. 总结

在本文中,我们探讨了如何将 XML 字符串转换为 XML 文档。我们介绍了两种方法:使用 InputSourceStringReader,以及使用 ByteArrayInputStream

第一种方法提供了更大的灵活性,允许我们微调解析过程,而第二种方法则更简单直接。根据具体需求,可以选择最适合的方法。


原始标题:Parse XML as a String in Java | Baeldung