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 文档。我们介绍了两种方法:使用 InputSource
和 StringReader
,以及使用 ByteArrayInputStream
。
第一种方法提供了更大的灵活性,允许我们微调解析过程,而第二种方法则更简单直接。根据具体需求,可以选择最适合的方法。