【问题标题】:How generate XMLElementWrapper annotation with xjc and customized binding如何使用 xjc 和自定义绑定生成 XMLElementWrapper 注释
【发布时间】:2014-09-26 18:20:02
【问题描述】:

我正在使用 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 类并直接在 Rootclass 中拥有 Item 对象列表?

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

感谢您的任何建议!

最好的问候, 马库斯

【问题讨论】:

    标签: java jaxb xjc


    【解决方案1】:

    Bjarne Hansen 为 xjc 开发了一个插件来解决这个问题。不幸的是,原始实现的链接现在已经失效。但是,Dmitry Katsubo 在 github 上有一个项目,它基于 Bjarne 的原始代码并进行了一些额外的改进。

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


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

    【讨论】:

    • 托马斯,谢谢。这个链接是我看到的关于这个主题的第一个正确的内容。
    • 我一直在尝试使用该插件,但无济于事。不确定这是否与 xjc 2.2.4 兼容(这是我目前所拥有的)。另外,我没有 jaxb-xjc.jar(xjc 是 JDK7 工具的一部分)。最后,我想从命令行调用 xjc,每个人都对如何做到这一点非常沉默(Kohsuke Kawaguchi 说“你也可以从命令行做到这一点,但它不是很漂亮。”)为什么我们不能只是有一个 jaxb:annotation 告诉 xjc “跳过”一个级别,即只生成一个 @XmlElementWrapper?
    • 请注意,我的答案是两年前的 - 我当时使用了该插件,它运行良好,但现在可能已经过时了。
    • 对于那些像我研究这个问题一样遇到这个的人,你可以在主 Maven 仓库中找到这个插件,groupId 为 com.github.jaxb-xew-plugin 和 artifactId 的 jaxb-xew-plugin .代码维护在github.com/dmak/jaxb-xew-plugin。
    • @davidfmatheson 想创建一个适当的答案来详细说明该解决方案吗?
    【解决方案2】:

    首先让我们分解您的架构,以便不生成内部类:

    <?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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多