2017-01-24 10 views
0

У меня есть DTD схемы в TradeMessage.dtd файле (это минимальный рабочий пример)JAXB ОТД конфликт поколения схема

<?xml version="1.0" encoding="UTF-8"?> 
<!ELEMENT BpsaMessage (BuyMessage | SellMessage)> 
<!ATTLIST BpsaMessage 
    unique_id CDATA #REQUIRED 
> 
<!ELEMENT BuyMessage (account)> 
<!ATTLIST BuyMessage 
    db_apply CDATA #REQUIRED 
> 
<!ELEMENT account EMPTY> 
<!ATTLIST account 
    client_nbr CDATA #REQUIRED 
> 
<!ELEMENT SellMessage (account)> 
<!ATTLIST SellMessage 
    db_apply CDATA #REQUIRED 
> 
<!ELEMENT account EMPTY> 
<!ATTLIST account 
    action CDATA #REQUIRED 
> 

И пытаются использовать эту команду, чтобы создать набор классов Java, ибо она

xjc -dtd -d result_folder -p org.company.model TradeMessages.dtd

К сожалению, у меня есть ошибка

parsing a schema... 
[ERROR] Element "account" was already declared 
    line 18 of file:/C:/Dev/Programs/Java/jdk1.8.0_60/bin/TradeMessage.dtd 

Failed to parse a schema. 

Вопросы:

  1. Как можно переименовать account элемент внутри SellMessage до, например, sellAccount с xjc обязательным файлом для разрешения конфликта имен?

  2. Как настроить связывание поставить BuyMessage класс в org.company.model.buy и SellMessage класса в org.company.model.sell отдельных пакетов?

  3. Можно ли задать привязку пропустить любые другие объявления DTD схемы в TradeMessage.dtd кроме BpsaMessage, SellMessage и BuyMessage?

+0

Вы не можете иметь дубликаты объявлений элементов в DTD. Вы можете добавить оба атрибута как #IMPLIED к одному определению, если вы готовы мириться с избыточными полями в вашем объекте, или вместо этого вы можете использовать xsd. – teppic

+0

@teppic на самом деле это не мой DTD. Это DTD из автономной системы, отправляющей нам XML-сообщения. Я не могу изменить или исправить это. Но мне нужно сгенерировать набор Java-классов для JAXB XML unmarshaller. –

ответ

0

ОТДА вы были предоставлены сломан, и никакой конфигурация xjc не может быть использована для работы вокруг него. xjc не может прочитать схему, потому что существует несколько определений account.

Вам не нужно использовать тот же DTD для генерации ваших бобов - вы можете использовать отредактированную копию. JAXB не ссылается на схему во время unmarshalling, поэтому все, что имеет значение, заключается в том, что схема, используемая для генерации bean-компонентов, соответствует структуре входного XML.

Вот фиксированный DTD:

<!ELEMENT BpsaMessage (BuyMessage | SellMessage)> 
<!ATTLIST BpsaMessage unique_id CDATA #REQUIRED> 
<!ELEMENT BuyMessage (account)> 
<!ATTLIST BuyMessage db_apply CDATA #REQUIRED> 
<!ELEMENT account EMPTY> 
<!ATTLIST 
    account client_nbr CDATA #IMPLIED 
    account action CDATA #IMPLIED 
> 
<!ELEMENT SellMessage (account)> 
<!ATTLIST SellMessage db_apply CDATA #REQUIRED> 

А вот соответствие XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="BpsaMessage"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="message" type="Message"/> 
      </xsd:sequence> 
      <xsd:attribute type="xsd:string" name="unique_id"/> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="Message" abstract="true"> 
     <xsd:attribute name="db_apply" type="xsd:string" use="required"/> 
    </xsd:complexType> 

    <xsd:complexType name="BuyMessage"> 
     <xsd:complexContent> 
      <xsd:extension base="Message"> 
       <xsd:sequence> 
        <xsd:element name="account"> 
         <xsd:complexType> 
          <xsd:attribute name="client_nbr" type="xsd:string" use="required"/> 
         </xsd:complexType> 
        </xsd:element> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 

    <xsd:complexType name="SellMessage"> 
     <xsd:complexContent> 
      <xsd:extension base="Message"> 
       <xsd:sequence> 
        <xsd:element name="account"> 
         <xsd:complexType> 
          <xsd:attribute name="action" type="xsd:string" use="required"/> 
         </xsd:complexType> 
        </xsd:element> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 
</xsd:schema> 
+0

Да, ясно, как создавать Java POJO. Но я не хочу делать это вручную, так как в будущем исходный DTD будет обновлен. –

+0

Ничто в этом мире не убедит xjc разобрать этот DTD. Вам придется заставить провайдера исправить это. – teppic