Как на .NET прочитать XSD-файлы, если ссылки на другие файлы оформлены через ?
У меня есть 3 XSD-файла: main.xsd, bah.xsd and body.xsd. Основной main.xsd содержит ссылки на 2 других XSD-файла таким вот образом:
<xs:any namespace="urn:......." processContents="strict"/>
Я читаю main.xsd. Основная цель получить результат, который позволит построить дерево элементов из всех трех XSD-файлов -
private XmlSchema ReadAndCompileSchema()
{
XmlSchema result = null;
XmlSchemaSet xmlSchemaSet = new XmlSchemaSet();
using (var reader = new XmlTextReader(_thisAddIn.XsdSchemaFile))
{
result = XmlSchema.Read(reader, new ValidationEventHandler(
(e, args) => throw new Exception("Can't read xml schema", args.Exception))
);
xmlSchemaSet.Add(result);
}
xmlSchemaSet.Compile();
return result;
}
К сожалению, результат выполнения метода ReadAndCompileSchema() возвращает только элементы из main.xsd, элементы же из bah.xsd и body.xsd - отсутствуют в result. Тут не желательно сильно модифицировать .XSD-файлы. Возможно, есть какой-то вариант изменить код на C#, чтобы можно было построить дерево элементов?
- 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 шт):
Автор решения: Pavel Mayorov
→ Ссылка
Просто закиньте в ваш schema set все три схемы, с остальным фреймворк разберётся:
var xmlSchemaSet = new XmlSchemaSet();
foreach (var file in new [] { "main.xsd", "bah.xsd", "body.xsd" }) {
using var reader = XmlReader.Create(file);
xmlSchemaSet.Add(XmlSchema.Read(reader, null));
}
xmlSchemaSet.Compile();