Объединить несколько XSD-файлов в один XSD на .NET или через утилиту
У меня есть 3 файла xsd, один основной, в нём ссылки на другие xsd-файлы оформлены через <xs:any namespace=urn:....>?
- Можно ли как-то программно на .NET объединить эти 3 xsd-файла в один xsd?
- Если нет, может есть хотя бы утилита или что-то типа того, что позволит это сделать вручную?
- main.xsd -
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:iso:std:iso:20022:tech:xsd:head.003.001.01">
<xs:import namespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" schemaLocation="bah.xsd"/>
<xs:element name="BizData" type="BusinessData"/>
<xs:complexType name="BusinessApplicationHeader">
<xs:sequence>
<xs:any namespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" processContents="strict"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="StrictPayload">
<xs:sequence>
<xs:any namespace="urn:iso:std:iso:20022:tech:xsd:DRAFT6auth.093.001.01" processContents="strict"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BusinessData">
<xs:sequence>
<xs:element name="Hdr" type="BusinessApplicationHeader"/>
<xs:element name="Pyld" type="StrictPayload"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
- bah.xsd -
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:iso:std:iso:20022:tech:xsd:head.001.001.01">
<xs:element name="AppHdr" type="ApplicationHeader"/>
<xs:complexType name="ApplicationHeader">
<xs:annotation>
<xs:documentation source="Name" xml:lang="EN">ApplicationHeader</xs:documentation>
<xs:documentation source="Definition" xml:lang="EN"></xs:documentation>
</xs:annotation>
..........
</xs:complexType>
</xs:schema>
- body.xsd -
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:DRAFT6auth.093.001.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:iso:std:iso:20022:tech:xsd:DRAFT6auth.093.001.01" elementFormDefault="qualified">
<xs:element name="Document" type="Document"/>
.....................
</xs:schema>
Ответы (1 шт):
Нет, в общем случае этого сделать нельзя.
Обратите внимание: каждый файл задаёт схему ровно для одного пространства имён. У вас три файла, которые используют три разных пространства имён. И эти три пространства имён вы в один файл никак не запихнёте.
Однако, вот что вы можете сделать:
во-первых, вы можете добавить в ваш main.xsd явный импорт файла body.xsd и его схемы при помощи любого редактора (включая Блокнот) по аналогии с уже имеющимся импортом файла bah.xsd - большинству программ такового указания более чем хватит чтобы "подхватить" схему;
во-вторых, вы можете выложить дополнительные схемы на сетевой ресурс и исправить атрибут schemaLocation в импортах так, чтобы он указывал на него - это может помочь с кривыми программами которые не умеют работать с несколькими файлами, но используют библиотеки которые это всё же умеют (однако это может поломать более умные программы);
если ограничение на один файл - строгое, но читающая схему программа - ваша - просто положите все три файла в zip-архив, и читайте его через System.IO.Compression.ZipArchive