База генерации java-кода JAXB на основе XSD-файла

#java #xml #jaxb

#java #xml #jaxb

Вопрос:

У меня возникла проблема с генерацией исходного кода Java на основе XSD-файла.

Пожалуйста, обратите внимание, что файл XSD был сгенерирован на основе примера XML.

Пример XML

 <resposta_importacao>
  <RetornoEnvio xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <num_apolice xmlns="compuletra">202476600001</num_apolice>
    <cod_retorno xmlns="compuletra">651</cod_retorno>
    <mensagem xmlns="compuletra">Erro de layout de dadosobrigatamp;#195;amp;#179;rios: cod_cobertura</mensagem>
    <id_validacao xmlns="compuletra">0</id_validacao>
  </RetornoEnvio>
  <RetornoEnvio xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <num_apolice xmlns="compuletra">202476600002</num_apolice>
    <cod_retorno xmlns="compuletra">651</cod_retorno>
    <mensagem xmlns="compuletra">Erro de layout de dados obrigatamp;#195;amp;#179;rios: cod_cobertura</mensagem>
    <id_validacao xmlns="compuletra">0</id_validacao>
  </RetornoEnvio>
</resposta_importacao>
 

Сгенерированный XSD

 <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="RetornoEnvio">
        <xsd:sequence>
            <xsd:element name="num_apolice" type="xsd:integer" xmlns="compuletra" />
            <xsd:element name="cod_retorno" type="xsd:int" xmlns="compuletra" />
            <xsd:element name="mensagem" type="xsd:string" xmlns="compuletra" />
            <xsd:element name="id_validacao" type="xsd:int" xmlns="compuletra" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="resposta_importacao">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element maxOccurs="unbounded" type="RetornoEnvio" name="RetornoEnvio" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
 

Сгенерированный Java-класс

 @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RetornoEnvio", propOrder = {
    "numApolice",
    "codRetorno",
    "mensagem",
    "idValidacao"
})
public class RetornoEnvio {

    @XmlElement(name = "num_apolice", required = true)
    protected BigInteger numApolice;
    @XmlElement(name = "cod_retorno")
    protected int codRetorno;
    @XmlElement(required = true)
    protected String mensagem;
    @XmlElement(name = "id_validacao")
    protected int idValidacao;
 

Проблема здесь в том, что XML имеет

xmlns=»compuletra»

Но класс Java этого не делает.

Я знаю, что могу просто вставить атрибут пространства имен в аннотацию XmlElement, но было бы лучше, если бы генерация кода могла вставить его для меня.

Спасибо

Ответ №1:

xmlns Атрибут в определении элемента в схеме XML не имеет ничего общего с определением пространства имен элемента. Вот почему JAXB ничего с этим не делает.

 <xsd:element name="cod_retorno" type="xsd:int" xmlns="compuletra" />
 

Комментарии:

1. Хорошо, я тоже так подумал, это был последний тест, который я сделал. Я действительно пробовал targetNamespace , namespace и xmlns .

Ответ №2:

Ну, просто чтобы ответить на мой собственный вопрос, чтобы он не остался без ответа..

Я мог бы добиться этого различия в пространстве имен с помощью наиболее очевидного решения, подумав об этом немного больше. В основном используется два XSD-файла с двумя разными пространствами имен и их импорт в третий XSD-файл.

Все работало так, как ожидалось.

Спасибо,

Тьяго