如何复用Java类处理不同name属性的XML编组?
问题描述
需要创建Java类来编组以下两个XML示例,要求复用同一个类处理不同name属性值的XML,同时支持动态修改该属性值:
示例1 XML:
<ns1:container name="test"> <ns1:subContainer type="String"> <ns1:value>hello_world</ns1:value> </ns1:subContainer> </ns1:container>
示例2 XML:
<ns1:container name="test2"> <ns1:subContainer type="String"> <ns1:value>hello_world2</ns1:value> </ns1:subContainer> </ns1:container>
当前编写的Java类如下,但@XmlAttribute(name="test")中的参数设置错误,无法适配不同属性值的XML:
public class Container { @XmlAttribute(name="test") private String name; @XmlElement(name="subContainer", namespace = "ns1") private SubContainer subContainer; public Container() { } public Container(String value, String name) { this.name = name; this.subContainer = new SubContainer("String", value); } }
请问如何复用该类处理第二个XML?或有没有更好的动态修改属性的方法?
解决方案
你混淆了@XmlAttribute的参数意义:name参数指定的是XML属性的名称(即<container>标签上的name这个属性名),而非属性的值。之前把属性值test写到了name参数里,这是核心错误。
修正后的Container类
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "container", namespace = "ns1") public class Container { // name参数固定为"name",对应XML属性的名称;Java字段name存储属性的动态值 @XmlAttribute(name = "name") private String name; @XmlElement(name = "subContainer", namespace = "ns1") private SubContainer subContainer; // JAXB需要无参构造器 public Container() { } public Container(String value, String name) { this.name = name; this.subContainer = new SubContainer("String", value); } // 必须添加getter/setter,JAXB需要访问字段 public String getName() { return name; } public void setName(String name) { this.name = name; } public SubContainer getSubContainer() { return subContainer; } public void setSubContainer(SubContainer subContainer) { this.subContainer = subContainer; } }
配套的SubContainer类
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; public class SubContainer { @XmlAttribute(name = "type") private String type; @XmlElement(name = "value", namespace = "ns1") private String value; public SubContainer() { } public SubContainer(String type, String value) { this.type = type; this.value = value; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
使用方式
只需在创建Container实例时传入不同的name值,即可生成对应属性的XML:
// 生成示例1的XML Container container1 = new Container("hello_world", "test"); // 生成示例2的XML Container container2 = new Container("hello_world2", "test2");
核心要点
@XmlAttribute(name = "name")中的"name"是固定的XML属性名称,不需要动态修改。- Java字段
private String name用来存储属性的动态值,通过构造器或setter方法即可修改,完全复用同一个类处理不同XML。
内容的提问来源于stack exchange,提问作者user19906023
相关产品推荐
相关产品推荐

