java - JAXB XML输出格式问题

标签 java xml jaxb

我有具有以下结构的 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();
        }
    }
}

我遇到的问题是 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>

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

谢谢。

最佳答案

缩进以 8 为模发生

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

你找到了

int i = depth%8;

关于java - JAXB XML输出格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601143/

相关文章:

java - 我如何在java中存储未知的数据类型(当用户输入(int/double)时就会知道)

java - JUnit 测试失败时显示用户友好的消息

java - 以 json 或 xml 格式在文件中写入类的实例

c# - 用 XElement 替换 XElement 内容

java - 处理同一组元素中包含的不同对象类型

java - 使用Java发送短信

java - 现实世界中的示例何时使用抽象类以及何时使用 Java 8 引入的接口(interface)(默认方法和静态方法)

java - Android 特定用户界面

java - 一组用于两个相同命名空间的 JAXB 类

java - JAXB:如何在没有注释的情况下判断一个类是否可编码(marshal)