0

我正在尝试使用 wsdl 从生成类jaxws-maven-plugin,但我得到了无法编译的结果。问题是其中一个 xsd 的这一部分,您可以在其中看到具有相同名称的嵌套元素:

<xs:complexType name="TrafficCountsReplyData" abstract="true">
<xs:sequence>
    <xs:element name="effectiveTrafficWindow" type="common:DateTimeMinutePeriod" minOccurs="1" maxOccurs="1"/>
    <xs:element name="flows" minOccurs="0" maxOccurs="1">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="item" type="flow:Flow" minOccurs="0" maxOccurs="100"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="counts" minOccurs="0" maxOccurs="1">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="item" minOccurs="0" maxOccurs="1440">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="key" type="common:DateTimeMinutePeriod" minOccurs="1"
                                        maxOccurs="1"/>
                            <xs:element name="value" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="item" minOccurs="1" maxOccurs="3">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="key" type="flight:TrafficType"
                                                                minOccurs="1" maxOccurs="1"/>
                                                    <xs:element name="value" type="flow:Counts" minOccurs="1"
                                                                maxOccurs="1"/>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:sequence>
</xs:complexType>

如您所见,有多个名为item. 这导致在单个类中具有相同名称的多个内部类TrafficCountsReplyData

因此,我正在尝试将一个绑定文件放在一起,该文件将重命名其中一个。当我尝试使用以下方法重命名元素中的外部item时:counts

    <jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']">
        <jaxb:class name="Lulz"/>
    </jaxb:bindings>

我收到以下错误:

[错误] XPath 评估“//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']”也会导致许多 (2) 个目标节点

当我像这样为内部创建绑定 xpath 表达式时:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']//xs:element[@name='item']//xs:element[@name='value']//xs:element[@name='item']">

然后我收到以下错误:

java.lang.IllegalArgumentException:非法类继承循环。外部类 Lulz 不能从内部类继承:Lulz

我不知道如何使这项工作。传承从何而来?item元素中还有另一个flows,但 Xpath 不应该匹配。没有绑定文件,我可以生成源代码。我在绑定文件中有正确的模式,因为我可以重命名由父元素生成的类。

4

2 回答 2

1

嗯,我有一个类似的问题,但是属性..我没有要检查完整的 xsd,但是如果您想将 OUTER 项目标签更改为其他内容,请尝试这个:

    <?xml version="1.0"?>
    <jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <jxb:bindings schemaLocation="../yourlocation/yourschema.xsd" version="1.0">
            <!-- Customise the package name -->

            <jxb:schemaBindings>
                <jxb:package name="whatyouwant.something"/>
            </jxb:schemaBindings>

            <!-- rename the value element -->
            <jxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:sequence//xs:element[@name='counts']//xs:complexType//xs:sequence//xs:element[@name='item']">
                     <jaxb:class name="Lulz"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings> 

如果这似乎不起作用,如果您可以披露 xml,我应该能够帮助您进一步(假期到星期一以防万一),但考虑到您给出了错误的“路径”,跳过了一些“子元素” xpath 表达式。让我知道。

于 2015-03-13T17:14:50.117 回答
0

我在这里找到了解决方案:JAXB Customizations With a Poor Formed WSDL

我必须/xs:complexType在 Xpath 的末尾添加。我猜这是因为类的根实际上是 complexType 而不是封闭 xs:element。所以它是这样的:

<jaxb:bindings node="//xs:complexType[@name='TrafficCountsReplyData']//xs:element[@name='counts']/xs:complexType/xs:sequence/xs:element[@name='item']/xs:complexType">
        <jaxb:class name="Lulz"/>
</jaxb:bindings>

现在我可以生成类并编译它们。

于 2015-03-13T17:58:50.643 回答