Автоматическое извлечение встроенного XSD из WSDL в файл (ы) XSD - PullRequest
7 голосов
/ 26 марта 2010

Я использую стороннюю веб-службу, определение и реализация которой находятся вне моего контроля. Этот веб-сервис изменится в будущем.

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

Мой подход:

  1. создать свой собственный XSD, ссылаясь на определения XSD WSDL вызываемой веб-службы (этот XSD также включает в себя типы XSD для дополнительной информации.)
  2. использовать среду привязки данных Java XML (например, ADB или JiXB) для генерации классов привязки данных из моего собственного файла XSD, начиная с шага 1
  3. использовать инфраструктуру Java SOAP (например, Axis2 или CXF) с той же структурой привязки данных для генерации классов привязки данных из WSDL (это позволило бы мне использовать объекты, полученные веб-службой непосредственно при генерации XML.)

Типы XSD, которые я собираюсь использовать в своем собственном файле XSD, но они определены в WSDL, могут быть изменены. Всякий раз, когда они меняются, я бы хотел снова автоматически обрабатывать привязку данных XSD и WSDL. (Если изменение является достаточно значительным, это может вызвать некоторые усилия по разработке. (Но обычно это не так.))

Моя проблема:

На шаге 1 мне нужен XSD, относящийся к тем же типам, которые используются веб-службой.

WSDL ссылается на другой WSDL, который ссылается на другой WSDL и т. Д. В конце концов существует WSDL с необходимыми встроенными типами XSD. Насколько я знаю, нет никакого способа напрямую ссылаться на встроенные типы XSD WSDL из XSD.

Подход, который я считаю наиболее жизнеспособным, состоит в том, чтобы включить дополнительный этап в автоматическую обработку (до привязки данных), которая извлекает встроенный XSD из WSDL в другие файлы XSD. Эти другие XSD-файлы можно затем ссылаться на мой собственный XSD-файл.

Вещи, которые я бы хотел избежать:

  • Скопируйте вручную вставку встроенного XSD в файл XSD (я ищу автоматический процесс).
  • Любые шаги вручную. (Как и при определении WSDL, который содержит встроенные типы вручную. (Расположение этого WSDL также изменяется).)
  • Использование xsd: any в моем собственном XSD. Я хотел бы, чтобы мой собственный XSD-файл был правильным.
  • Использование не Java-технологии (например, .NET)
  • Огромное количество реализации (но советы о том, как вы бы реализовали такое извлечение, приветствуются в любом случае)

PS: Я нашел несколько похожих вопросов, но у них были ответы: WTH, вы бы хотели это сделать? Вот причина моей довольно большой предыстории.

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Я не знаю ни одной библиотеки, которая бы делала это для вас, но это определенно возможно реализовать с небольшим усилием (~ 200 строк). Грубая метапрограмма для генерации всех встроенных и включенных XSD:

method processWSDL(Document wsdl) {
    for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) {
        call processXSD("inline_[i].xsd",".")
    }
    for each ("/wsdl:definitions/wsdl:import" in wsdl) {
        Document x = read and parse ("@location")
        if (x is WSDL) call processWSDL(x)
        else if (x is XSD) call processXSD("@location", x)
    }
}

method processXSD(String filename, Document xsd) {
    write "xsd" to a new file "filename"   // if 'filename' is a URL, take only the part after the last '/'
    for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) {
        if ("@schemaLocation" is local reference) {     // no 'http://' prefix
            Document x = read and parse ("@schemaLocation")
            call processXSD("@schemaLocation", x)
        }
    }
}

Это не полное решение, например не обрабатывает префиксы пространства имен, определенные вне встроенной схемы, но, надеюсь, дает хорошую отправную точку.

2 голосов
/ 30 мая 2012

Просто чтобы сохранить актуальность этого поста, все изменилось с тех пор, как был принят ответ.Теперь в Java можно генерировать то, что вы хотите, начиная с WSDL;JAX-WS предоставляет инструмент wsimport , который выполняет именно то, что запрашивается: возьмите WSDL, создайте клиентский прокси вместе с набором JAXB-аннотированных классов для/ marshalling запросов.

Я бы сказал, что, по мнению @MoizTankiwala, необходимость экспортировать XSD-контент из WSDL (или включить весь внешний XSD-контент в раздел типов WSDL) жива и здорова,

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

Второе такжевостребованный, поскольку некоторым (главным образом) динамическим языкам все еще не хватает полной поддержки от инструментов, когда дело доходит до WSDL для генерации прокси на стороне клиента.

Мой другой ответ на SO говорит о сходной необходимостиэто должно помочь, по крайней мере, с просьбой Moiz ...

...