В сгенерированном коде как получить доступ к фасетам, объявленным в файле XSD? - PullRequest
4 голосов
/ 20 мая 2010

То, что я думал, должно было быть простой проблемой, оказывается довольно головокружительным.

В настоящее время я использую JAXB 2 для генерации кода из XSD, который я не могу контролировать. Мне нужно получить доступ к ограничениям из схем, чтобы я мог применить некоторую логику и защитный код при установке значений в этих объектах. Валидация навалом просто не подойдет. В большинстве случаев я могу просто обрезать строку, и все будет хорошо. Для этого мне нужно получить длину, объявленную в XSD, чтобы применить ее в защитном коде и сохранить этот уровень универсальным. Альтернатива - копировать и жестко кодировать длины, но, честно говоря, если бы был лучший способ сделать это, я был бы очень признателен.

Я говорю о длине строки здесь, но это относится ко всем аспектам, объявленным в XSD.

Предложения, примеры кода и ссылки приветствуются, в основном все, что поможет мне НЕ жестко кодировать данные в классах.

Спасибо

Ответы [ 2 ]

4 голосов
/ 21 июля 2010

Я столкнулся с подобной проблемой, и лучшее решение, которое я нашел, было написать свой собственный плагин XJC. Плагин XJC имеет доступ как к XML-схеме, так и к сгенерированным классам, поэтому он кажется самым простым способом получить информацию об ограничениях. Мой плагин добавил аннотацию к любому полю в сгенерированном классе, к которому были применены ограничения в схеме. Например, такой элемент, как

<xs:element name="text">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:maxLength value="20" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

будет выглядеть как

@XmlRestrictions(maxLength = 20)
protected String text;

в сгенерированном файле класса. Затем вы можете использовать отражение, чтобы извлечь информацию об ограничениях из поля.

Документация для создания плагина не слишком велика, но я нашел эту статью полезной. Взгляните на исходный код плагина Default Value , чтобы узнать, как развернуть представление XJC в памяти схемы XML и структуры сгенерированного класса. Также будут полезны API JAXB , XSOM и CodeModel .

1 голос
/ 13 августа 2012

Похоже, XSD содержит семантические "рекомендации" вместо четких правил. ИМХО, если XSD согласован, несоблюдение этого приведет к нарушению.

Если это не так, и XSD содержит рекомендации, подлежащие интерпретации, я бы потратил время на понимание API синтаксического анализа XSD и попытался бы решить проблему таким способом. Нет смысла изобретать колеса здесь.

Однако я бы поставил под сомнение принятый подход и попытался бы согласовать четкие правила внутри XSD.

...