Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中美化XML字符串_Java_Xml_Dom_Pretty Print_Transformer - Fatal编程技术网

如何在Java中美化XML字符串

如何在Java中美化XML字符串,java,xml,dom,pretty-print,transformer,Java,Xml,Dom,Pretty Print,Transformer,我有一个格式不正确的XML字符串。我想用Java做适当的缩进。关于这个问题有很多答案。其中一个最广为接受、最精彩的答案是: 但是这个答案的问题是,代码总是需要一个根元素,而我的字符串中有如下XML标记: <person> <address>New York</address> </person> <person> <address>Ottawa</address> </person> 纽约 渥太

我有一个格式不正确的XML字符串。我想用Java做适当的缩进。关于这个问题有很多答案。其中一个最广为接受、最精彩的答案是:

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

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

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

我试着从上面的答案中使用的库中查看任何可用的方法。但是没有用

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


p.S.请先阅读问题,然后再将其标记为副本。我知道有类似的问题,但我的问题是完全不同的。

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

假设您的结构是一个名为
xml
的字符串

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

纽约
渥太华
然后添加一个根元素

xml = "<myDummyRoot>" + xml + "</myDummyRoot>";
xml=”“+xml+”;
它给出了结构

<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=xml.replaceAll(“,”);

…这将为您留下一个可读的XML文档(尽管缩进时有一些额外的间距)。

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

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


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

如果您的XML没有根元素,则它无效。通过字符串操作添加根元素,使用方法缩进,然后通过字符串操作再次删除它?这里的第一个问题不应该是“如何做”,而是“为什么需要它”?通常不需要漂亮的打印,尤其是当程序处理XML时(通常是这样)。@seelenVirtuse XML不需要缩进进行处理,它需要缩进,以便我可以以更美观、可读的方式将其输出到文件中。您正在将无效的XML文件返回给用户?实际上,我可以获取对象块,然后执行伪附加,比如每次执行1000次,然后对其进行美化,并以这种方式执行100次。。这实际上是可行的。我不确定你是否也有同样的建议。但你的想法应该行得通。非常感谢,伙计。实际上数据不是来自文件。它来自DB,在DB中作为连接字符串返回。我知道这很奇怪,但这就是应用程序的意图。