Elim的博客

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


Elim

JAXB系列之XMLID

先来看一个示例。现有如下两个类,Order和Product。

	@XmlAccessorType(XmlAccessType.FIELD)
	public static class Product {
		private String id;
		private String name;
		//省略get/set方法
	}
	
	@XmlRootElement
	@XmlAccessorType(XmlAccessType.FIELD)
	public static class Order {
		
		private Integer id;
		private Product product;
		private Integer num;
		//省略get/set方法
		
	}

如果我们用如下这样的测试代码把Order类型的对象转换为XML结构,会是什么样呢?测试代码如下:

	@Test
	public void test() {
		Product product = new Product();
		product.setId("1");
		product.setName("香蕉");
		
		Order order = new Order();
		order.setId(1);
		order.setProduct(product);
		order.setNum(10);
		
		JAXB.marshal(order, System.out);
		
	}

生成的XML如下:

<order>
    <id>1</id>
    <product>
        <id>1</id>
        <name>香蕉</name>
    </product>
    <num>10</num>
</order>

如果我们期望Order对象在转换为XML时不是把整个的product的结构都展现出来,而是展现对应的ID,怎么办呢?这个时候就可以使用XmlID和XmlIDREF注解了。XmlID用于指定一个类中的某个属性为其唯一标识,对应的属性类型必须是String,且在一个类中只能有一个属性使用@XmlID注解;XmlIDREF用于指定在把一个对象的某个复杂类型的属性转化为XML时,不是直接转换整个对象的结构,而是转换其对应的XmlID。为此,我们在Product的id属性上加上XmlID注解,在Order的Product属性上加上XmlIDREF注解。

	@XmlAccessorType(XmlAccessType.FIELD)
	public static class Product {
		@XmlID
		private String id;
		private String name;
		//省略get/set方法
	}
	
	@XmlRootElement
	@XmlAccessorType(XmlAccessType.FIELD)
	public static class Order {
		
		private Integer id;
		@XmlIDREF
		private Product product;
		private Integer num;
		//省略get/set方法
		
	}

使用上述配置进行之前的测试用例,输出如下内容:

<order>
    <id>1</id>
    <product>1</product>
    <num>10</num>
</order>

可以看到我们的product已经被转换为对应的id表示了。如果我们希望Order中的product属性输出的XML元素名称不是product,而是productId应该怎么办呢?可以加上@XmlElement(name=”productId”)。

	@XmlRootElement
	@XmlAccessorType(XmlAccessType.FIELD)
	public static class Order {
		
		private Integer id;
		@XmlIDREF
		@XmlElement(name="productId")
		private Product product;
		private Integer num;
		//省略get/set方法
		
	}

如果希望product能变为order元素的一个属性怎么办呢?可以加上@XmlAttribute注解。

	@XmlRootElement
	@XmlAccessorType(XmlAccessType.FIELD)
	public static class Order {
		
		private Integer id;
		@XmlIDREF
		@XmlAttribute
		private Product product;
		private Integer num;
		//省略get/set方法
		
	}

生成的XML内容如下:

<order product="1">
    <id>1</id>
    <num>10</num>
</order>

(注:本文由Elim写于2017年8月9日)