JAXB генерирует неправильное пространство имен - PullRequest
2 голосов
/ 15 ноября 2010

У меня есть xsd (назовем его afb), который импортирует другой xsd (назовем его kts).И я ссылаюсь на элемент kts.xsd в afb.xsd вместе с правильными пространствами имен.

Но когда я генерирую классы, используя JAXB, пространство имен для ссылочного элемента неверно.

Я имею в видууказанный элемент должен иметь пространство имен kts, где он имеет пространство имен afb.

Из-за чего проверка моего XML по этому xsd не проходит, и он не может связать данные xml с моделями java.

EX: afb.xsd:

<xs:import namespace="http://www.boschkts.com" schemaLocation="kts.xsd"/>
<xs:element name="vehicle">

<xs:complexType>
        <xs:sequence>
          <xs:element ref="vType"/>
          <xs:element name="RESULTS" type="kts:RESULTS" >
        </xs:sequence>
    </xs:complexType>
</xs:element>

kts: xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschkts.com" 
targetNamespace="http://www.boschkts.com" elementFormDefault="qualified">

<xs:complexType name="RESULTS">
    <xs:sequence>
        <xs:element name="SUMMARY" type="SUMMARY" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

Vehicle.java:

public class Vehicle {

    @XmlElement(namespace = "http://www.boschafb.com", required = true)
    protected String vType;
    @XmlElement(name = "RESULTS", namespace = "http://www.boschafb.com", required = true)
    protected Results results;

}

Если я наблюдаю Vehicle.java, свойство namespace of results должно быть "http://www.boschkts.com" вместо" http://www.boschafb.com"

. Если я изменю пространство имен вручную, тогда будет работать привязка данных из xml к моделям java.Но все равно проверка по xsd завершается неудачно с ошибкой:

Вызывается: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Обнаружено недопустимое содержимое, начиная с элемента 'kts:РЕЗУЛЬТАТЫ'.Ожидается один из {{* http://www.boschafb.com":RESULTS}'.

Кто-нибудь может указать, что мне может не хватать в xsd? Или это способ, которым генерирует jaxb, и я должен изменить классы вручную?

С уважением,

Сатья

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Я предполагаю, что ваша abf.xsd начинается с

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschafb.com"
           targetNamespace="http://www.boschafb.com" elementFormDefault="qualified">

Если для elementFormDefault установлено значение qualified, все объявления элементов, даже вложенные, принадлежат указанному целевому пространству имен. Обратите внимание, что это относится только к элементам, ссылочный тип не влияет на пространство имен элемента, ссылающегося на него.

Решением будет определение элемента вместо типа в 'kts.xsd' и ссылка на этот элемент в вашей первой схеме:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschkts.com" 
           targetNamespace="http://www.boschkts.com" elementFormDefault="qualified">
    <xs:element name="RESULTS">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SUMMARY" type="SUMMARY" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.boschafb.com"
           targetNamespace="http://www.boschafb.com" elementFormDefault="qualified"
           xmlns:kts="http://www.boschkts.com">

    <xs:import namespace="http://www.boschkts.com" schemaLocation="kts.xsd"/>

    <xs:element name="vehicle">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="vType"/>
                <xs:element ref="kts:RESULT"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
0 голосов
/ 23 сентября 2013

Попробуйте использовать включение вместо импорта следующим образом:

<xs:include schemaLocation="kts.xsd"/> вместо <xs:import namespace="http://www.boschkts.com" schemaLocation="kts.xsd"/>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...