[英]Reuse JAXB classes for similar xml schemas
我有以下XML,對於每種XML,我都有使用JAXB建模的相應Java類。
XML 1:
<counts at="2019-06-27 09:54:31">
<media id="1" start="1" finish="1000" timeZone="NZST">
<count id="1" value="1" at="2019-06-27 09:54:31" duration="5"/>
<count id="2" value="2" at="2019-06-27 09:54:31" duration="5"/>
<count id="3" value="3" at="2019-06-27 09:54:31" duration="5"/>
</media>
</counts>
XML 2:
<tags at="2019-06-27 09:54:31">
<media id="1" start="1" finish="1000" timeZone="NZST">
<tag id="1" value="1" at="2019-06-27 09:54:31" visible="true" />
<tag id="2" value="2" at="2019-06-27 09:54:31" visible="true" />
<tag id="3" value="3" at="2019-06-27 09:54:31" visible="true" />
</media>
</tags>
XML 3:
<trajectories at="2019-06-27 09:54:31">
<media id="1" start="1" finish="1000" timeZone="NZST">
<trajectory id="1" value="1" at="2019-06-27 09:54:31" />
<trajectory id="2" value="2" at="2019-06-27 09:54:31" />
<trajectory id="3" value="3" at="2019-06-27 09:54:31" />
</media>
</trajectories>
由於所有XML中的大多數元素幾乎相同,除了<count>, <tag> and <trajectory>
。 有沒有一種方法可以抽象<counts>, <tags>, <trajectories> and <media>
?
理想情況下,我想要這樣的東西:
class CountsTagsTrajectories<T extends CommonObjectsOfMedia> {
private Media<T> media;
}
class Media<T> {
private List<T> listOfObjects;
}
class Count extends CommonObjectsOfMedia {
...
...
...
}
class Tag extends CommonObjectsOfMedia {
...
...
...
}
class Trajectory extends CommonObjectsOfMedia {
...
...
...
}
這種方法可行嗎? 否則我將不得不上類似的課程:
Counts > CountMedia > Count
Tags > TagMedia > Tag
Trajectories > TrajectoryMedia > Trajectory
我現在嘗試抽象類時面臨的問題是,我需要在@XmlElement中定義一個名稱,無論它是計數/計數,標簽/標記還是軌跡/軌跡。
注意:我看過這篇文章,但是它的作用是將所有可能的“ CommonObjectsOfMedia”列表添加到Media類,而這並不是我想要的。
您走在正確的道路上。 有兩點可以改進。
首先,因為有了CommonObjectsOfMedia
@XmlAccessorType(XmlAccessType.FIELD)
public class CommonObjectsOfMedia {
@XmlAttribute
private String id;
@XmlAttribute
private String value;
@XmlAttribute
private String at;
}
然后,媒體內部的標簽具有共同的額外屬性。 看起來像:
@XmlAccessorType(XmlAccessType.FIELD)
public class MediaTag extends CommonObjectsOfMedia {
@XmlAttribute
private boolean visible;
}
計數相似:
@XmlAccessorType(XmlAccessType.FIELD)
public class MediaCount extends CommonObjectsOfMedia {
@XmlAttribute
private String duration;
}
和軌跡只有共同點。
現在,讓我們創建Media類,該類將能夠處理它們的任何情況。 魔術來自@XmlElements
。
@XmlAccessorType(XmlAccessType.FIELD)
public class Media {
@XmlAttribute
private String id;
@XmlAttribute
private String start;
@XmlAttribute
private String finish;
@XmlAttribute
private String timeZone;
@XmlElements ({
@XmlElement(name="tag", type = MediaTag.class),
@XmlElement(name="trajectory", type = CommonObjectsOfMedia.class),
@XmlElement(name="count", type = MediaCount.class),
})
private List<CommonObjectsOfMedia> commonObjectsOfMedia;
}
我將創建一個演示類,該類將同時顯示所有案例的解組。 xml看起來像這樣:
<someroot at="2019-06-27 09:54:31">
<media id="1" start="1" finish="1000" timeZone="NZST">
<tag id="1" value="1" at="2019-06-27 09:54:31" visible="true" />
<tag id="2" value="2" at="2019-06-27 09:54:31" visible="true" />
<tag id="3" value="3" at="2019-06-27 09:54:31" visible="true" />
</media>
<media id="1" start="1" finish="1000" timeZone="NZST">
<trajectory id="1" value="1" at="2019-06-27 09:54:31" />
<trajectory id="2" value="2" at="2019-06-27 09:54:31" />
<trajectory id="3" value="3" at="2019-06-27 09:54:31" />
</media>
<media id="1" start="1" finish="1000" timeZone="NZST">
<count id="1" value="1" at="2019-06-27 09:54:31" duration="5"/>
<count id="2" value="2" at="2019-06-27 09:54:31" duration="5"/>
<count id="3" value="3" at="2019-06-27 09:54:31" duration="5"/>
</media>
</someroot>
和這樣的根類:
@XmlRootElement
public class Someroot {
@XmlElement
private List<Media> media;
}
這將正確解組。 我們轉到項目2。
根名稱不同,但內部結構相同。 也許您也想解決此問題。 可以如下面的回復所示: JAXB可以處理多個“根”元素嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.