我正在使用JAXB和xjc将我的XML Schema编译为Java类。我不想手动编辑这个生成的类。我有像这样的xml架构:
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence>
<xs:element ref="item" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
xjc生成一个只包含Items
个对象列表的类Item
。是否有机会省略班级Items
并直接在Item
班级中列出Root
个对象?
我知道这可以通过@XMLElementWrapper
注释完成,但我不知道如何告诉xjc创建这样的注释。
感谢您的任何建议!
祝你好运, 马库斯
答案 0 :(得分:11)
Bjarne Hansen开发了一个xjc插件,可以解决这个问题。不幸的是,原始实现的链接现在已经死了。然而,Dmitry Katsubo在github上有一个项目,基于Bjarne的原始代码并进行了一些额外的改进。
→https://github.com/dmak/jaxb-xew-plugin
(仅供参考:原始链接,现已死亡:http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin)
答案 1 :(得分:8)
首先让我们分解您的架构,以便不会生成内部类:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="root" type="Root" />
<xs:complexType name="Root">
<xs:sequence>
<xs:element name="items" type="Items" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="item" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:schema>
你仍然可以获得额外的课程,而不是一个文件。现在,您要在构建中添加一个部分以使用jaxb-xew-plugin
。我使用Maven,所以对我来说这看起来像:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<args>
<arg>-no-header</arg>
<arg>-Xxew</arg>
<arg>-Xxew:instantiate lazy</arg>
<arg>-Xxew:delete</arg>
</args>
<plugins>
<plugin>
<groupId>com.github.jaxb-xew-plugin</groupId>
<artifactId>jaxb-xew-plugin</artifactId>
<version>1.0</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
如果您开始使用命名空间以便生成的类具有包名称,请不要使用-Xxew:delete
标记,因为我最近修复了一个错误,即它在删除对象时不应该删除它。或者,您可以从github获取代码并将其用作1.1-SNAPSHOT。
当我这样做时,我得到了我认为你正在寻找的代码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Root", propOrder = {
"items"
})
public class Root {
@XmlElementWrapper(name = "items", required = true)
@XmlElement(name = "item")
protected List<String> items;
public List<String> getItems() {
if (items == null) {
items = new ArrayList<String>();
}
return items;
}
public void setItems(List<String> items) {
this.items = items;
}
}