如何使用xjc和自定义绑定生成XMLElementWrapper注释

DEA*_*0CC 18 java jaxb xjc

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

xjc生成一个Items只包含Item对象列表的类.是否有机会省略该类ItemsItem直接在Root类中列出对象?

我知道这可以通过@XMLElementWrapper注释完成,但我不知道如何告诉xjc创建这样的.

谢谢你的任何建议!

最好的问候,马库斯

Tho*_*mas 11

Bjarne Hansen开发了一个xjc插件,可以解决这个问题.不幸的是,原始实现的链接现在已经死了.然而,Dmitry Katsubo在github上有一个项目,基于Bjarne的原始代码并进行了一些额外的改进.

https://github.com/dmak/jaxb-xew-plugin


(仅供参考:原始链接,现已死:http://www.conspicio.dk/blog/bjarne/jaxb-xmlelementwrapper-plugin)

  • 对于那些遇到过这种情况的人,就像我研究过这个问题一样,你可以在主要的Maven仓库中使用groupId com.github.jaxb-xew-plugin和artifactId of jaxb-xew-plugin找到这个插件.代码保存在https://github.com/dmak/jaxb-xew-plugin. (2认同)

dav*_*son 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>
Run Code Online (Sandbox Code Playgroud)

你仍然会得到额外的课程,而不是一个文件.现在,您要在构建中添加一个部分以使用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>
Run Code Online (Sandbox Code Playgroud)

如果您开始使用命名空间以便生成的类具有包名称,请不要使用该-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;
    }

}
Run Code Online (Sandbox Code Playgroud)