Oto XSD:Korzystanie XSD z obejmuje
<?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>
Oto drugi XSD, która obejmuje jeden powyżej:
<?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>
I trzeba czytać (drugi) XSD do C# i:
- sprawdzić, że jest to ważny XSD i
- dokumenty walidacji przeciwko niemu.
Oto niektóre C#, aby przeczytać w schematach:
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() nie działa, ponieważ "Type 'A: TheSimpleType' nie jest zadeklarowana, czy nie jest to prosty typ"
Jednak to działa jeśli:
- przestrzeń nazw jest usuwany ze schematu, lub
- przestrzeń nazw jest dodawany do include.
Pytanie brzmi: w jaki sposób mogę uzyskać C#, aby zaakceptować to bez edytowania schematów?
Podejrzewam, że problem polega na tym, że chociaż umieściłem oba schematy w XmlSchemaSet, nadal muszę powiedzieć C#, że jeden jest zawarty w drugim, tj. Nie wyszedł sam z siebie. Rzeczywiście, jeśli tylko opowiem XmlSchemaSet o głównym XSD (a nie o dołączeniu) (oba bez (lub z) przestrzeniami nazw), wówczas "Typ" TheSimpleType "nie jest zadeklarowany lub nie jest prostym typem."
W związku z tym wydaje się, że to pytanie dotyczy rozwiązania: w jaki sposób ?!
+1 nigdy nie wiedział o klasie 'XmlSchemaInclude'. Świetna odpowiedź. – psubsee2003
OK, dobrze. Ale teraz przypuśćmy, że muszę określić wszystkie załączenia w czasie wykonywania, tj. Dam ci arbitralny XSD z zawartością i musisz iść i pobrać je wszystkie. –
's = XmlSchema.Read (r, null);' Teraz widzę, że mamy 's.Includes', które są obiektami' XmlSchemaInclude' i jest poprawnie wypełniony (z 1). –