#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
пространстве имен:
import
include
redefine
Вы должны знать, что в XMLSchema-instance
пространстве имен квалифицированный schemaLocation
атрибут будет содержать пары, разделенные пробелами, где каждый компонент с четным номером является местоположением (элементы с нечетным номером являются пространствами имен).