gpt4 book ai didi

java - 如何使用具有类似结构的类容器元素的 JAXB 避免代码重复

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:58:03 26 4
gpt4 key购买 nike

情况

我正在使用 MOXy 的 JAXB 实现来处理一个大型 XML 文档,该文档的架构具有许多类似的复杂类型。具体来说,大约有两打类型充当具有以下结构的列表包装器元素:

<ITEMS attr1="X" attr2="Y">
<ITEM>...</ITEM>
...
<EXTENSION/>
<ITEMS>

对于这些类似列表包装器的元素中的每一个,名称都会发生变化,并且所包含的列表元素也会发生变化。但是,属性(都是可选的)和单个 EXTENSION 元素(也是可选的)始终存在。下面是其中两种类型的使用示例:

<ROLES visible="false">
<ROLE type="X"/>
<ROLE type="Y"/>
</ROLES>

<PAYMENTS visible="true">
<PAYMENT>
<PAYEENAME>Joe</PAYEENAME>
</PAYMENT>
<EXTENSION>
<SOMETHING>Here</SOMETHING>
</EXTENSION>
</PAYMENTS>

问题

我想避免代码重复,因为这些元素之间唯一发生变化的是名称及其包含的一个或多个元素。执行此操作的最佳方法是什么?

我只能看到两种可能的解决方案。

1

使用泛型创建具体类以指示要在发生变化的集合中使用的对象类型。然后使用 MOXy 的外部 OX 映射来指示应如何序列化该类的任何个人使用。像这样的东西:

public class GenericContainer<T> {
@XmlAttribute
protected Boolean visibile;
@XmlElement(name = "Extension")
protected Extension extension;

// OX Mappings done in external meta file
protected List<T> items;
...
}

虽然我喜欢这个选项,但似乎不可能在每次使用的基础上重新定义类的 OX 映射。

2

创建一个没有 List 属性的基类,然后为每个自定义包装器元素创建一个具体类。这个解决方案绝对有效,但我最终会得到大约两打几乎相同的类。

#1 是可行的还是有我没有想到的更好的方法来处理这个问题?

提前致谢!

最佳答案

public class GenericContainer {

private Boolean visible;
private Object extension;
private List<Object> nodes;

@XmlAttribute
public Boolean isVisible() {
return visible;
}

public void setVisible(Boolean visible) {
this.visible = visible;
}

@XmlElement(name="EXTENSION")
public Object getExtension() {
return extension;
}

public void setExtension(Object extension) {
this.extension = extension;
}

@XmlAnyElement
public List<Object> getNodes() {
return nodes;
}

public void setNodes(List<Object> nodes) {
this.nodes = nodes;
}

}

并读取 XML 实例

    JAXBContext jaxbContext = JAXBContext.newInstance("jaxbtest1");
Unmarshaller um = jaxbContext.createUnmarshaller();

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("src/test1.xml"));
Node node = doc.getFirstChild();

JAXBElement<GenericContainer> jaxbE = um.unmarshal(node, GenericContainer.class);

GenericContainer gc = jaxbE.getValue();
Boolean vis = gc.isVisible();
Element ext = (Element)gc.getExtension();
for(Object o : gc.getNodes()) {
Element listItem = (Element)o;
}

但是代码重复真的很重要吗?如果您的模式具有列表容器类型的公共(public)扩展基础,并且您正在使用 xjc,为什么要避免不同的类?毕竟 JAXB 背后的想法是为每个独特的复杂类型提供一个值类。

如果您可以设计通用逻辑来处理相似但不同的 XML 类型并且不想要大量的 Java 类,您可以切换到 StAX。

关于java - 如何使用具有类似结构的类容器元素的 JAXB 避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11444609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com