Elim的博客

用来记录一些原创性的总结


Elim

指定JAXB生成的XML元素顺序

正常情况使用JAXB生成的XML的元素顺序是混乱的,比如我们来看下面这个示例,我们有一个Person类,里面有几个属性,我们需要把它直接转换为对应的XML表示。

public class ElementOrderTest {

	@Test
	public void test() {
		Person person = new Person();
		JAXB.marshal(person, System.out);
	}
	
	public static class Person {

		private Integer id = 1;
		private String name = "张三";
		private Integer dept = 1;
		private Date registTime = new Date();
		private String username = "zhangsan";

		//...省略get和set方法

	}

}

生成出来的XML如下所示,基本上是没有规则的。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <dept>1</dept>
    <id>1</id>
    <name>张三</name>
    <registTime>2017-06-22T20:27:05.070+08:00</registTime>
    <username>zhangsan</username>
</person>

但有时候我们又期望它能够以明确的顺序输出。比如上面的Person我们希望输出的元素顺序依次是idnameusernamedeptregistTime,那应该怎么办呢?JAXB对此的支持是通过在类上使用@XmlType注解来进行标注,通过其propOrder属性来指定属性被转换为XML的顺序,它里面指定的值是对应的对应的属性,而不是生成的XML的元素名称。所以对此我们只需要在Person类上添加XmlType注解即可。

	@XmlRootElement
	@XmlType(propOrder={"id", "name", "username", "dept", "registTime"})
	public static class Person {

		private Integer id = 1;
		private String name = "张三";
		private Integer dept = 1;
		private Date registTime = new Date();
		private String username = "zhangsan";

		//...省略get和set方法

	}

通过XmlTypepropOrder属性指定了属性生成XML的顺序后输出结果如下。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <id>1</id>
    <name>张三</name>
    <username>zhangsan</username>
    <dept>1</dept>
    <registTime>2017-06-22T20:39:29.994+08:00</registTime>
</person>

如果我们需要指定节点顺序的对象不是根节点,其子节点的顺序指定方式也是一样的。假设我们现在需要在Person上新加一个Post类型的属性,Post对应的是员工的岗位,其有三个属性,我们要求这三个属性生成的XML元素的顺序必须是idnamelevel。则我们可以进行如下定义。

	@XmlRootElement
	@XmlType(propOrder = { "id", "name", "username", "dept", "post", "registTime" })
	public static class Person {

		private Integer id = 1;
		private String name = "张三";
		private Integer dept = 1;
		private Date registTime = new Date();
		private String username = "zhangsan";
		private Post post = new Post();//岗位

		//...省略get和set方法

	}

	@XmlType(propOrder={"id", "name", "level"})
	public static class Post {
		private Integer id = 1;
		private String name = "产品经理";// 岗位名称
		private Integer level = 5;// 职级

		//...省略get和set方法
	}

生成出来的XML效果如下所示。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <id>1</id>
    <name>张三</name>
    <username>zhangsan</username>
    <dept>1</dept>
    <post>
        <id>1</id>
        <name>产品经理</name>
        <level>5</level>
    </post>
    <registTime>2017-06-22T20:55:35.834+08:00</registTime>
</person>

(本文由Elim写于2017年6月22日)