JAXB xjc: два объявления вызывают коллизию - PullRequest
0 голосов
/ 30 января 2019

Я нашел похожее обсуждение по этой теме здесь .Но сценарий там полностью отличался от этого, и решение не работает для меня.Поэтому я снова поднимаю этот вопрос.

Мой XSD (sample.xsd)

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="field">
      <xsd:complexType>
         <xsd:choice maxOccurs="unbounded" minOccurs="0">
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="ProgramLevel">
               <xsd:complexType>
                  <xsd:attribute name="value" type="xsd:string" use="optional"/>
                  <xsd:attribute name="desc" type="xsd:string" use="optional"/>
               </xsd:complexType>
            </xsd:element>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="Program">
               <xsd:complexType>
                  <xsd:sequence maxOccurs="unbounded" minOccurs="0">
                     <xsd:element maxOccurs="unbounded" minOccurs="0" name="Level">
                        <xsd:complexType>
                           <xsd:attribute name="value" type="xsd:string" use="optional"/>
                           <xsd:attribute name="desc" type="xsd:string" use="optional"/>
                        </xsd:complexType>
                     </xsd:element>
                  </xsd:sequence>
               </xsd:complexType>
            </xsd:element>
         </xsd:choice>
      </xsd:complexType>
    </xsd:element>
</xsd:schema>

Мой XML

<field>
    <ProgramLevel value="x" />
</field>
<field>
    <Program>
        <Level value="y" />
    </Program>
</field>

Следующая ошибка при запуске команды xjc

[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 7 of file:/D:/ProgramPractice/CreateXSD/JAXB/sample.xsd

[ERROR] (Related to above error) This is the other declaration.
  line 16 of file:/D:/ProgramPractice/CreateXSD/JAXB/sample.xsd

Failed to produce code.

Есть идеи, как решить конфликт между 'ProgramLevel' и 'Program->Level' с помощью файла привязки?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Наконец, проблема решена путем добавления следующего в файл привязки:

<jxb:bindings schemaLocation="sample.xsd" node="/xsd:schema">
    <jxb:bindings node="//xsd:element[@name='ProgramLevel']/xsd:complexType">
      <jxb:class name="ProgramLevelInfo"/>
    </jxb:bindings>
</jxb:bindings>
0 голосов
/ 30 января 2019

Это очень просто.Вы используете композитор choice в определении типа элемента field.Но choice означает, что среди всех включенных в него частиц в целевом XML может появиться только одна.Таким образом, согласно вашей sample.xsd схеме <ProgramLevel> и <Program> могут не появляться одновременно как дочерние элементы элемента <field>.Только один из них может быть использован!

Если вы хотите и то и другое, вы должны использовать вместо этого xsd:sequence composer и изменить вашу схему следующим образом:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="field">
    <xsd:complexType>
       <xsd:sequence maxOccurs="unbounded" minOccurs="0">
       ...
       </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

Тогда, ваш XML пройдет проверку (без коллизий).

Обратите внимание, что у xsd:sequence composer также есть свои ограничения.Это означает, что указанные в нем частицы должны появляться в целевом XML строго в том же порядке, что и в XML-схеме.То есть следующее также будет неправильным: <field><Program>...</Program><ProgramLevel/></field>.Таким образом, вы должны изменить схему соответственно, если вам это нужно.Однако, если порядок вообще не должен быть ограничен, используйте all composer (или даже более сложную конструкцию).

PS Следующие ссылки могут быть интересны для тех, кто работает со схемами XML и WSDL:

Если вы цените мое участие на этом сайте, пожалуйста, не удаляйте эти ссылки!

...