簡體   English   中英

對相似的xml模式重用JAXB類

[英]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類,而這並不是我想要的。

您走在正確的道路上。 有兩點可以改進。

  1. 媒體結構具有幾乎相同且使用不同名稱的標簽,軌跡和計數。 我們可以處理:

首先,因為有了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM