java JAXB XML 输出格式问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/601143/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JAXB XML output format questions
提问by His
I have Java classes with the following structure (the class names do not imply anything, I was just making them up).
我有具有以下结构的 Java 类(类名不暗示任何东西,我只是编造了它们)。
package test;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
@XmlRootElement
public class Test
{
@XmlAccessorType(XmlAccessType.FIELD)
static class Machine
{
@XmlElementWrapper(name="servers")
@XmlElement(name="server")
List<Server> servers = new ArrayList<Server>();
}
@XmlAccessorType(XmlAccessType.FIELD)
static class Server
{
Threshold t = new Threshold();
}
@XmlAccessorType(XmlAccessType.FIELD)
static class Threshold
{
RateThreshold load = new RateThreshold();
}
@XmlAccessorType(XmlAccessType.FIELD)
static class RateThreshold
{
@XmlAccessorType(XmlAccessType.FIELD)
static class Rate
{
int count;
Period period = new Period();
}
@XmlAccessorType(XmlAccessType.FIELD)
private static class Period
{
@XmlAttribute
private String type = "second";
@XmlValue
private float period;
}
Rate min = new Rate();
Rate max = new Rate();
}
@XmlElementWrapper(name="machines")
@XmlElement(name="machine")
List<Machine> machines = new ArrayList<Machine>();
public static void main(String[] args)
{
Machine m = new Machine();
Server s = new Server();
s.t.load.max.count = 10;
s.t.load.min.count = 1;
m.servers.add(s);
Test t = new Test();
t.machines.add(m);
JAXBContext jaxbContext;
Marshaller marshaller;
try
{
jaxbContext = JAXBContext.newInstance(Test.class);
marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(t, System.out);
}
catch (JAXBException e)
{
e.printStackTrace();
}
}
}
The problem I am having is with the XML output generated by JAXB when marshalling a Test instance. The XML output would always look like the following:
我遇到的问题是在编组 Test 实例时由 JAXB 生成的 XML 输出。XML 输出将始终如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test>
<machines>
<machine>
<servers>
<server>
<t>
<load>
<min>
<count>1</count>
<period type="second">0.0</period>
</min>
<max>
<count>10</count>
<period type="second">0.0</period>
</max>
</load>
</t>
</server>
</servers>
</machine>
</machines>
</test>
As you can see, some elements are not being indented properly (that is, the deepest elements, count and period). Why is that? Is there something wrong with the way I created the JAXB context? Or is there a maximum limit to how many elements that can be indented recursively by JAXB? How could I fix this? Note that I have also set JAXB_FORMATTED_OUTPUT to true, but still get the improper indentation.
如您所见,某些元素没有正确缩进(即最深的元素、计数和句点)。这是为什么?我创建 JAXB 上下文的方式有问题吗?或者 JAXB 可以递归缩进多少个元素有最大限制?我怎么能解决这个问题?请注意,我还将 JAXB_FORMATTED_OUTPUT 设置为 true,但仍然得到不正确的缩进。
Thanks.
谢谢。
采纳答案by Markus
Indenting occurs modulo 8, in
缩进发生模 8,在
com.sun.xml.bind.v2.runtime.output.IndentingUTF8XmlOutput
you find
你发现
int i = depth%8;
回答by Mike Nakis
One of the overloads of the marshal()method of the marshaler accepts an XMLStreamWriter, so you can bypass the brain-damaged formatting mechanism of the Reference Implementation of JAXB by writing your own formatting XML stream writer. You would end up doing something like this:
marshal()marshaler 方法的重载之一接受 XMLStreamWriter,因此您可以通过编写自己的格式化 XML 流编写器来绕过 JAXB 的参考实现的脑残格式化机制。你最终会做这样的事情:
public static void SaveContainer( Container container, OutputStream stream ) throws ...
{
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter( stream, "UTF-8" );
writer = new MyAwesomeCoolFormattingXMLStreamWriter( writer );
marshaller.marshal( container, writer );
}
回答by Ross Judson
I don't think there's a limit. I've seen very deep nesting, without any difficulties. Do you have any whitespace control in place? Also, you haven't provided the definition of the RateThreshold class, which is the one creating the unexpected output.
我认为没有限制。我见过非常深的嵌套,没有任何困难。你有任何空白控制吗?此外,您还没有提供 RateThreshold 类的定义,该类是创建意外输出的类。
回答by David Fischer
You need to set the line width - default is 72.
您需要设置线宽 - 默认为 72。
OutputFormat of = new OutputFormat();
OutputFormat of = new OutputFormat();
of.setLineWidth(1000);
of.setLineWidth(1000);

