当前位置: 首页 > 面试题库 >

JAXB XML输出格式问题

吴俊风
2023-03-14
问题内容

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


 类似资料:
  • 最近,我在这篇文章中读到了关于C#三部分显示格式的内容:https://diptimayapatra.wordpress.com/2014/01/13/3-part-format-of-numbers-in-c/ 3部分格式用于显示正、负和零值数字。字符串格式有三个部分。第一部分对应于阳性试验,第二部分对应于阴性试验。最后一部分用于值为零时。 其结果将为“(+)29.12” 这样做的结果将是“积极

  • 我们可以看到格式化就是通过格式字符串得到特定格式: format!("{}", foo) -> "3735928559" format!("0x{:X}", foo) -> "0xDEADBEEF" format!("0o{:o}", foo) -> "0o33653337357" 根据使用的参数类型,同样的变量(foo)能够格式化成不同的形式:X, o 和未指定形式。 这个格式化的功能是通过 t

  • 问题内容: 我想知道Java是否有某种类可以帮助输出格式化。我知道在C ++中,在iomanip中,有一个方法调用setw。我想知道Java是否有与此类似的东西。 问题答案: 看看java.util.Formatter。 String.format()提供了一个方便的包装器。 例如(从链接上的示例修改): 它超越了C的?printf格式。例如,它支持可选的语言环境,并且格式符号可以通过显式索引而不

  • 主要内容:实例,实例,格式变量,实例,实例,实例,实例,输出到其它文件,实例,实例Perl 是一个非常强大的文本数据处理语言。 Perl 中可以使用 format 来定义一个模板,然后使用 write 按指定模板输出数据。 Perl 格式化定义语法格式如下: 参数解析: FormatName :格式化名称。 fieldline :一个格式行,用来定义一个输出行的格式,类似 @,^,<,>,| 这样的字符。 value_one,value_two…… :数据行,用来向前面的格式行

  • 主要内容:实例,运行实例标签呈现HTML文本,但可以接受参数化输入。 以下JSF代码 - 被渲染成以下HTML代码 - 实例 打开NetBean8.2,创建一个名称为:OutputFormat 的JavaWeb JSF工程。以下是文件:UserBean.java中的代码 - 以下是文件:index.xhtml中的代码 - 运行实例 Tomcat启动完成后,在浏览器地址栏中输入以下URL。 得到结果如下图所示 -

  • 本文向大家介绍JSON格式化输出,包括了JSON格式化输出的使用技巧和注意事项,需要的朋友参考一下 今天有个需求是对输出的JSON进行格式化 首先想到的就是jsBeautifier之类的小插件 搜索了一番看到有一位朋友回答JSON.stringify可以输出格式化的JSON字符串 唔,不错 PS:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用: 在线JSON代码检验