20

我试图为每种类型的元素只制作一个适配器,所以我创建了一个 bindings.xml 文件:

<jxb:bindings node="//xs:attribute[@type='Id']"

因此,我的意图是针对“Id”类型的每个属性。问题是 xjc 告诉我“目标节点太多(3)”......但这正是我想要的!

4

2 回答 2

40

尝试添加 multiple="true" 属性:

<jxb:bindings multiple="true" node="//xs:attribute[@type='Id']"
于 2012-12-07T17:27:54.957 回答
0

我最终遇到了类似的问题“目标节点过多(3)”,但是在任何网站上都找不到任何答案...发布我在经过大量跟踪和错误后找到的解决方案...解决的基本思路“目标节点太多(3)”是提供完整的 XPATH 节点,这是您的 XSD 中的多个节点。

下面是我的 XSD:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="document">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="asset">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="attribute" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="string" minOccurs="0">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute type="xs:string" name="value" use="optional"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="date" minOccurs="0">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute type="xs:string" name="value" use="optional"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="array" minOccurs="0">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="struct"  maxOccurs="unbounded" minOccurs="0">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="field" maxOccurs="unbounded" minOccurs="0">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="integer" minOccurs="0">
                                        <xs:complexType>
                                          <xs:simpleContent>
                                            <xs:extension base="xs:string">
                                              <xs:attribute type="xs:byte" name="value"/>
                                            </xs:extension>
                                          </xs:simpleContent>
                                        </xs:complexType>
                                      </xs:element>
                                      <xs:element name="assetreference" minOccurs="0">
                                        <xs:complexType>
                                          <xs:simpleContent>
                                            <xs:extension base="xs:string">
                                              <xs:attribute type="xs:string" name="type"/>
                                              <xs:attribute type="xs:long" name="value"/>
                                            </xs:extension>
                                          </xs:simpleContent>
                                        </xs:complexType>
                                      </xs:element>
                                    </xs:sequence>
                                    <xs:attribute type="xs:string" name="name" use="optional"/>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                          <xs:element name="integer" minOccurs="0">
                            <xs:complexType>
                              <xs:simpleContent>
                                <xs:extension base="xs:string">
                                  <xs:attribute type="xs:long" name="value"/>
                                </xs:extension>
                              </xs:simpleContent>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="file" minOccurs="0">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute type="xs:string" name="name" use="optional"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="integer" minOccurs="0">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute type="xs:short" name="value"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute type="xs:string" name="name" use="optional"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute type="xs:long" name="id"/>
            <xs:attribute type="xs:string" name="type"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

以下是适用于上述 XSD 的 JAXB 绑定文件:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          version="2.1">
    <bindings schemaLocation= "../assetproduct.xsd" version="1.0">
        <!-- Customise the package name 
        <schemaBindings>
            <package name="com.example.schema"/>
        </schemaBindings> -->

        <!-- rename the value element -->
        <bindings node="//xs:element[@name='document']">
            <bindings node="//xs:element[@name='asset']">
                <bindings node="//xs:element[@name='attribute']">

                    <bindings node="//xs:element[@name='string']">
                        <bindings node=".//xs:attribute[@name='value']">
                            <property name="ValueAttribute"/>
                        </bindings>
                    </bindings>


                    <bindings node="//xs:element[@name='date']">
                        <bindings node=".//xs:attribute[@name='value']">
                            <property name="ValueAttribute"/>
                        </bindings>
                    </bindings>

                    <bindings node="//xs:element[@name='array']">

                        <bindings node=".//xs:element[@name='struct']">
                            <bindings node=".//xs:element[@name='field']">

                                <bindings node=".//xs:element[@name='integer']/xs:complexType">
                                    <bindings node=".//xs:attribute[@name='value']">
                                        <property name="ValueAttribute"/>
                                    </bindings>
                                </bindings>

                                <bindings node=".//xs:element[@name='assetreference']">
                                    <bindings node=".//xs:attribute[@name='value']">
                                        <property name="ValueAttribute"/>
                                    </bindings>
                                </bindings>

                            </bindings>
                        </bindings>

                    </bindings>

                    <bindings node=".//xs:element[@name='array']/xs:complexType/xs:sequence/xs:element[@name='integer']">
                            <bindings node=".//xs:attribute[@name='value']">
                                <property name="ValueAttribute"/>
                            </bindings>
                    </bindings>

                    <bindings node="//xs:element[@name='attribute']/xs:complexType/xs:sequence/xs:element[@name='integer']">
                        <bindings node=".//xs:attribute[@name='value']">
                            <property name="ValueAttribute"/>
                        </bindings>
                    </bindings>
                </bindings>
            </bindings>
          </bindings>
    </bindings>
</bindings>
于 2015-08-06T12:26:23.253 回答