JAXB XML输出格式问题

我有以下结构的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 servers = new ArrayList(); } @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 machines = new ArrayList(); public static void main(String[] args) { Machine m = new Machine(); Server s = new Server(); stload.max.count = 10; stload.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(); } } } 

我遇到的问题是在编组Test实例时由JAXB生成的XML输出。 XML输出将始终如下所示:

          1 0.0   10 0.0         

如您所见,某些元素没有正确缩进(即最深的元素,计数和句点)。 这是为什么? 我创建JAXB上下文的方式有问题吗? 或者JAXB递归缩进的元素数量是否有最大限制? 我怎么能解决这个问题? 请注意,我还将JAXB_FORMATTED_OUTPUT设置为true,但仍然得到不正确的缩进。

谢谢。

缩进发生在模8中,在

 com.sun.xml.bind.v2.runtime.output.IndentingUTF8XmlOutput 

你发现

 int i = depth%8; 

封送程序的marshal()方法的一个重载接受XMLStreamWriter,因此您可以通过编写自己的格式化XML流编写器来绕过JAXB的Reference实现的大脑损坏的格式化机制。 你最终会做这样的事情:

 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 ); } 

我认为没有限制。 我看到很深的筑巢,没有任何困难。 你有空白控制吗? 此外,您尚未提供RateThreshold类的定义,该类是创建意外输出的类。

您需要设置线宽 – 默认值为72。

OutputFormat of = new OutputFormat();

of.setLineWidth(1000);