Схема XML: замена импорта соответствующей схемой - PullRequest
9 голосов
/ 06 февраля 2012

У меня есть XML-схема, которая содержит несколько импортов, которые в свою очередь содержат импорт.Мне нужно сгенерировать семантически равную схему, где весь импорт встроен.Я хочу заменить это:

<xs:import namespace="http://some.name/" schemaLocation="./path/to/it.xsd"/>

содержимым ссылочных схем.И мне нужно получить вывод в виде строки, а не в виде некоторого внутреннего представления.

Я пытался Apache Xerces , но не нашел способа записать XSModel в строку.

Я пытался Apache XmlSchema 2 , но когда он пишет схему XML, он не заменяет объявления импорта схемой.

Есть ли какая-нибудь библиотека, которая может это сделать?Есть предложения?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 06 февраля 2012

xsd: include обычно может быть встроенным, а xsd: import - нет.Это потому, что xsd: import используется для ссылки на документ схемы для другого целевого пространства имен, и в одном и том же документе схемы не может быть компонентов с разными целевыми пространствами имен.

5 голосов
/ 06 февраля 2012

Как указано здесь и здесь , ограничение XSD наличием одного целевого пространства имен на файл делает ваш «семантически эквивалентный» запрос невозможным для решения. Это верно и также типично для всех сценариев, где само пространство имен используется для определения границ (или уточнения) семантических наборов.

В течение одного рефакторинга времени или времени проектирования, когда вам не нужно программно иметь дело с такой вещью периодически или динамически, вы также можете попытаться взглянуть здесь ; Возможно, проблема в вашем случае не в том, что импорт не поддерживается (что я нахожу странным), а в том, что сложность включения / импорта делает график слишком сложным для ваших инструментов. Как показано в последнем сообщении, проблема была решена путем свертывания включений с чистым эффектом сокращения числа необходимых импортов.

В качестве альтернативы, если каким-то образом ваша «семантическая эквивалентность» не включает пространства имен (например, я видел людей, которые весьма заинтересованы в разработке реляционной модели из XSD), возможно, с помощью рефакторинга можно привести все пространства имен в один (или ни один, то есть нет целевого пространства имен), а затем передать его в свой инструмент. Единственный улов здесь, с точки зрения автоматического рефакторинга, состоит в том, чтобы убедиться, что в разных пространствах имен нет дублированных именованных XSD-компонентов; например не может иметь одинаковое имя для элемента, или типа, или атрибута, или группы и т. д. в разных пространствах имен.

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