Usando XSDs com inclui
Aqui está um XSD:
<code><?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> </code>
Aqui está um segundo XSD que inclui o anterior:
<code><?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> </code>
Eu preciso ler o (segundo) XSD em C # e:
verifique se é um XSD válido evalidar documentos contra ele.Aqui está algum C # para ler nos esquemas:
<code> 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(); </code>
O .Compile () falha porque "Tipo 'a: TheSimpleType' não está declarado ou não é um tipo simples."
No entanto, funciona se:
o namespace é removido do esquema ouo namespace é adicionado ao include.A pergunta é: como faço para que o C # aceite isso sem editar os esquemas?
Eu suspeito que o problema é que, embora eu tenha colocado os dois esquemas no XmlSchemaSet, eu ainda preciso dizer ao C # que um está incluído no outro, ou seja, ele não resolveu por si mesmo. De fato, se eu disser apenas o XmlSchemaSet sobre o XSD principal (e não o include) (ambos sem (ou com) namespaces), então "Type 'TheSimpleType' não é declarado ou não é um tipo simples."
Assim, esta parece ser uma questão sobre a resolução inclui: como ?!