Разбор JAXB "minOccours" - проблема с unmarshling - PullRequest
1 голос
/ 22 сентября 2011

У меня есть следующий XSD, который я использовал для создания объектов JAXB

<xs:complexType name="packageType">
    <xs:sequence>
        <xs:element ref="package" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="dependencies" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:NMTOKEN" use="required"/>
</xs:complexType>

Теперь, если я получу XML

  1. нет зависимость тег
  2. пустой тег зависимостей , т.е.

Пример XML

<package id="FA33" required="false" empty="false">
  <dependencies />
</package>

В приведенном выше примере, если я удалю пустой тег «зависимости», JAXBвыдает ошибку «неожиданный конец пакета».

Поскольку minOccours существует, оба эти сценария не должны иметь значения.Но в моем случае JAXB не может демонтировать данный xml в case1 , т. Е. Если нет тега зависимости.Если есть пустой тег зависимостей, то он работает нормально.

Это ожидаемое поведение или что-то не так?

PS: я использую Jaxb 1.3

1 Ответ

3 голосов
/ 22 сентября 2011

Как насчет использования JAXB 2?

JAXB 1 используется для проверки на unmarshall.Это было проблемой, так как вы не могли действительно восстановить неправильный XML с отсутствующими обязательными элементами и т. Д.

Насколько я помню, я использовал для решения этой проблемы:

  • Регистрация«игнорирующий» обработчик проверки
  • Генерация производных от схемы классов с исправленной версией jaxb-xjc

Обработчик выглядит следующим образом:

import javax.xml.bind.ValidationEventHandler;

/**
 * Validation handler which ignores all the validation events.
 */
public class IgnoringValidationEventHandler implements ValidationEventHandler {

    /**
     * Static instance.
     */
    public static final ValidationEventHandler INSTANCE = new IgnoringValidationEventHandler();

    /**
     * Simply returns <code>true</code>
     * 
     * @param event
     *            ignored;
     * @return Always returns <code>true</code>.
     */
    public boolean handleEvent(javax.xml.bind.ValidationEvent event) {
        return true;
    }
}

Зарегистрировать егочерез marshaller.setEventHandler(IgnoringValidationEventHandler.INSTANCE);.

Что касается пропатченного jaxb-xjc, вы можете связаться со мной через valikov (at) gmx.net, я могу выслать вам банку.

...