Вот XSD:
<?xml version="1.0"?>
<xsd:schema
elementFormDefault='unqualified'
attributeFormDefault='unqualified'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
>
<xsd:simpleType name='TheSimpleType'>
<xsd:restriction base='xsd:string' />
</xsd:simpleType>
</xsd:schema>
Вот второй XSD, который включает в себя следующее:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
elementFormDefault='unqualified'
attributeFormDefault='unqualified'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
targetNamespace='a'
xmlns='a'
>
<xsd:include schemaLocation='Include.xsd' />
<xsd:element name = "TheElement" >
<xsd:complexType>
<xsd:attribute name="Code" type="TheSimpleType" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Мне нужно прочитать (второй) XSD в С# и:
- проверьте, что это действительный XSD, и
- проверить документы против него.
Вот несколько С# для чтения в схемах:
XmlSchemaSet schemaSet = new XmlSchemaSet();
foreach (string sd in Schemas)
{
using (XmlReader r = XmlReader.Create(new FileStream(sd, FileMode.Open)))
{
schemaSet.Add(XmlSchema.Read(r, null));
}
}
schemaSet.CompilationSettings = new XmlSchemaCompilationSettings();
schemaSet.Compile();
Ошибка .Compile() завершается с ошибкой, потому что "Тип": TheSimpleType 'не объявлен или не является простым типом. "
Однако он работает, если:
- пространство имен удаляется из схемы или
- пространство имен добавляется к include.
Вопрос: как мне заставить С# принять его без редактирования схем?
Я подозреваю, что проблема заключается в том, что, хотя я поместил обе схемы в XmlSchemaSet, мне все равно нужно сообщить С#, что один из них включен в другой, то есть он не работал сам по себе. Действительно, если я расскажу только XmlSchemaSet об основном XSD (а не о включении) (оба без (или с) пространствами имен), тогда "Тип" TheSimpleType "не объявлен или не является простым типом".
Таким образом, это, кажется, вопрос о разрешении включает: как?!