java - 为类似的 xml 模式重用 JAXB 类
问题描述
我有以下 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 项。
根的名称不同,但内部结构相同。也许你也想解决这个问题。这可以如以下回复所示完成:Can JAXB handle multiple "root" elements?
推荐阅读
- angular - 在 Angular 中,如何定义“路由器”成员字段?
- javascript - Laravel 6 CSS JS未在服务器上加载
- java - java更新后出现UnsupportedClassVersion错误
- html - 从一个文件到另一个文件的 HTML 链接样式标记
- android - onResume 后活动“冻结”
- java - 将 xml 文件中的文本打印到 java GUI jfeild 时出错(找不到文件)
- java - 从 JAR 文件创建独立的 Mac 应用程序
- excel - 如何在 VBA 中格式化某个字符串(日期)?
- java - 从 JSON 创建一个 POJO 数组
- c++ - 递归向量返回