Ссылки WSDL на другие файлы

#web-services #xpath #xsd #wsdl

#веб-службы #xpath #xsd #wsdl

Вопрос:

Я пишу программу, которая извлекает WSDL и любые импортированные файлы, а затем сохраняет их в одном каталоге. Что я хочу сделать как часть этого, так это сгладить файловую структуру, чтобы был только один каталог, содержащий все файлы, на которые ссылается WSDL или на которые ссылаются его ссылочные файлы. Итак, мне нужно зайти в каждый файл и везде, где есть импорт, мне нужно удалить путь из имени. Вот пример:

 <xsd:import schemaLocation="xsds/Currency.xsd" namespace="urn:example.com:enterprise:schemas:reference:currency">
</xsd:import>
 

Итак, приведенный выше импорт ссылается на файл xsds/Currency.xsd , и я хочу просто извлечь Currency.xsd его из этого. Я могу получить содержимое этого атрибута с помощью выражения XPath для соответствия тегу следующим образом:

 //*[local-name()='import']/@schemaLocation
 

Однако, вероятно, существуют другие типы тегов, в которых WSDL или xsd, на которые он ссылается, могут импортировать файлы, которым это выражение XPath не будет соответствовать. Какие другие теги или имена полей мне могут понадобиться для сопоставления, чтобы я не пропустил ни одного файла?

Ответ №1:

Возможно, вы захотите использовать

 //@schemaLocation
 

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

Элементы, содержащие schemaLocation атрибуты в XSD пространстве имен:

  1. import
  2. include
  3. redefine

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