如何在Java中美化XML String

时间:2016-02-23 07:35:01

标签: java xml dom pretty-print transformer

我有一个格式不正确的XML String。我想使用Java进行适当的缩进。关于这个问题,关于SO有很多答案。其中一个最广为接受和最出色的答案是:

Pretty print XML in java 8

但这个答案的问题是,代码总是需要一个根元素,而我的String中有XML标签,如下所示:

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

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

我试图看到上述答案中使用的库中提供的任何方法。但没有用。

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

P.S。请在将此标记为重复之前请阅读,请阅读问题。我知道在SO上有类似的问题,但我的问题却完全不同。

3 个答案:

答案 0 :(得分: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文档(尽管缩进了一些额外的间距)。

答案 1 :(得分:1)

似乎你的主要问题不是美化XML,而是内存管理。 Joachim给了你一个非常好的方法来美化它,但你没有足够的内存来实现它。

假设您的字符串来自文件,您应该使用不需要一次加载整个文件的文件操作技术。您可以使用FileInputStream和FileOutputStream来创建具有根开始和结束元素的文件的临时副本。然后,您可以使用XMLStreamReader逐个浏览<person>个标记。

如果您的字符串不在文件中,则将其转储到临时文件中,然后按上述步骤将其从内存中取出。

答案 2 :(得分:0)

Undercore-java库具有静态方法U.formatXml(xml)。我是该项目的维护者。