Java 使用JAXB将两个同构XML模式解析为一个类结构
考虑两种同构的XML模式。这里的同构意味着这两个模式除了属性和标记名之外,都有相同的结构。更具体地说,我有一个活生生的例子,比如was模式Java 使用JAXB将两个同构XML模式解析为一个类结构,java,xml,jaxb,Java,Xml,Jaxb,考虑两种同构的XML模式。这里的同构意味着这两个模式除了属性和标记名之外,都有相同的结构。更具体地说,我有一个活生生的例子,比如was模式A,以及它的副本B,其中所有标记和属性名称都从英语翻译成了国家语言等价物 例如,作为输入,我们可以有一个对象的两个不同变体: <tag_1_v1> <tag_2_v1 id="blabla" name="xxxxx"> Some value1 </tag_2_v1> <tag_3
A
,以及它的副本B
,其中所有标记和属性名称都从英语翻译成了国家语言等价物
例如,作为输入,我们可以有一个对象的两个不同变体:
<tag_1_v1>
<tag_2_v1 id="blabla" name="xxxxx">
Some value1
</tag_2_v1>
<tag_3_v1 id="alalala" name="yyyyy">
Some value2
</tag_3_v1>
</tag_1_v1>
对于如何解决这个问题,有各种各样的想法,但它们都不是那么方便,因为在同一类结构上使用单个JAXB注释方案是不可能的。它们是:
都可以有不同的属性,因此一个干净的解决方案是使用继承:
- 创建由
和Tag1V1
继承的抽象类Tag1V2
。将所有常用代码分解为Tag1
Tag1
- 同样的情况也会发生在
和Tag2
上Tag3
Tag2
的一个实现:
@XmlRootElement
@XmlSeeAlso({Tag2V1.class, Tag2V2.class})
abstract class Tag2 {
private String name;
private String content;
@XmlAttribute(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlValue
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
@XmlRootElement(name = "tag_2_v1")
class Tag2V1 extends Tag2 {
private String id;
@XmlAttribute(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@XmlRootElement(name = "tag_2_v2")
class Tag2V2 extends Tag2 {
private String specialId2;
@XmlAttribute(name = "special_id_2")
public String getSpecialId2() {
return specialId2;
}
public void setSpecialId2(String specialId2) {
this.specialId2 = specialId2;
}
}
我可能会选择选项2。这听起来像是最简单的选择。
class Tag1 {
Tag2 tag2;
Tag3 tag3;
}
class Tag2 {
String id;
String name;
String value;
}
class Tag3 {
String id;
String name;
String value;
}
@XmlRootElement
@XmlSeeAlso({Tag2V1.class, Tag2V2.class})
abstract class Tag2 {
private String name;
private String content;
@XmlAttribute(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlValue
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
@XmlRootElement(name = "tag_2_v1")
class Tag2V1 extends Tag2 {
private String id;
@XmlAttribute(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@XmlRootElement(name = "tag_2_v2")
class Tag2V2 extends Tag2 {
private String specialId2;
@XmlAttribute(name = "special_id_2")
public String getSpecialId2() {
return specialId2;
}
public void setSpecialId2(String specialId2) {
this.specialId2 = specialId2;
}
}