【问题标题】:How to prettify XML String in Java如何在 Java 中美化 XML 字符串
【发布时间】:2016-06-04 22:16:54
【问题描述】:

我有一个格式不正确的 XML 字符串。我想使用 Java 进行适当的缩进。关于这个问题,SO上有很多答案。最被广泛接受和出色的答案之一是:

Pretty print XML in java 8

但这个答案的问题在于,代码总是需要一个根元素,而我的字符串中有 XML 标记,如下所示:

<person>
<address>New York</address>
</person>
<person>
<address>Ottawa</address>
</person>

如您所见,这里没有根元素。只是人的多个标签。

我已尝试查看上述答案中使用的库中可用的任何方法。但是没用。

我不知道有没有出路。但是,如果有人能想到一些东西,我将非常感激。

附注请在将其标记为重复之前阅读问题。我知道关于 SO 有类似的问题,但我的问题完全不同。

【问题讨论】:

  • 如果你的 XML 没有根元素,那么它是无效的。 xmlvalidation.com/index.php?id=1&L=0
  • 通过字符串操作添加根元素,使用该方法缩进并通过字符串操作再次删除它?
  • 这里的第一个问题不应该是“怎么做”而是“为什么需要它”?通常不需要漂亮的打印,尤其是当程序正在处理 XML 时(通常是这样)。
  • @Seelenvirtuose XML不需要缩进处理,它需要缩进,以便我可以以更漂亮和可读的方式将其输出到文件中。
  • 您正在向您的用户返回一个 invalid XML 文件?

标签: java xml dom pretty-print transformer


【解决方案1】:

你可以使用字符串操作来接近;

假设您的结构在一个名为 xml 的字符串中;

<person>
<address>New York</address>
</person>
<person>
<address>Ottawa</address>
</person>

然后添加一个根元素;

xml = "<myDummyRoot>" + xml + "</myDummyRoot>";

给出结构

<myDummyRoot>
<person>
<address>New York</address>
</person>
<person>
<address>Ottawa</address>
</person>
</myDummyRoot>

这是一个有效的 XML 文档,应该可以使用链接的方法来意图,给出类似的东西;

<myDummyRoot>
    <person>
        <address>New York</address>
    </person>
    <person>
        <address>Ottawa</address>
    </person>
</myDummyRoot>

一个简单的字符串replaceAll然后可以再次删除根元素

xml = xml.replaceAll("</?myDummyRoot>", "");

...这应该会给您留下一个可读的 XML 文档(尽管缩进有一些额外的间距)。

【讨论】:

  • 实际上,我可以获取大量 对象,然后像一次获取 1000 个对象一样进行虚拟追加并美化它,并以这种方式执行 100 次。这实际上可以工作。我不确定你是否提出同样的建议。但你的想法应该可行。非常感谢朋友。
【解决方案2】:

看来您的主要问题不是美化 XML,而是内存管理。 Joachim 为您提供了一个非常好的方法来美化它,但是您没有足够的内存来实现它。

假设您的字符串来自一个文件,您应该使用不需要您一次加载整个文件的文件操作技术。您可以使用 FileInputStream 和 FileOutputStream 创建具有根打开和关闭元素的文件的临时副本。然后,您可以使用 XMLStreamReader 一次遍历一个 &lt;person&gt; 标签。

如果您的字符串不在文件中,则通过将其转储到临时文件中来将其从内存中取出,然后按上述方法继续。

【讨论】:

  • 实际上数据不是来自文件。它来自 DB 并作为 DB 中的连接字符串返回。我知道这很奇怪,但这就是应用程序的意图。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 2017-12-15
  • 2021-05-13
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
相关资源
最近更新 更多