Aquí se presenta una XSD:Uso de XSDs con incluye
<?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>
Aquí está una segunda XSD que incluye la de arriba:
<?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>
Necesito leer la (segunda) XSD en C# y:
- cheque que se trata de un XSD válido y
- documentos validar su contra.
Aquí es un poco de C# para leer en los esquemas:
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();
El .Compile() falla porque "Tipo 'a: TheSimpleType' no se declara, o no es un tipo simple."
Sin embargo, funciona si:
- el espacio de nombres se retira del esquema o
- el espacio de nombres se añade al incluir.
La pregunta es: ¿cómo consigo que C# lo acepte sin editar los esquemas?
Sospecho que el problema es que aunque he puesto ambos esquemas en el XmlSchemaSet, aún necesito decirle a C# que uno está incluido en el otro, es decir, que no lo ha resuelto por sí mismo. De hecho, si solo le digo a XmlSchemaSet sobre el XSD principal (y no el incluido) (ambos sin (o con) espacios de nombres), entonces "Tipo 'TheSimpleType' no está declarado, o no es un tipo simple."
Por lo tanto, esto parece ser una pregunta sobre la resolución incluye: ¿cómo?
+1 nunca supe la clase 'XmlSchemaInclude'. Gran respuesta. – psubsee2003
OK, bien. Pero ahora supongamos que tengo que determinar todas las inclusiones en tiempo de ejecución, es decir, le doy un XSD arbitrario con includes y debe ir a buscarlas todas. –
's = XmlSchema.Read (r, null);' Ahora veo que tenemos 's.Includes' que son objetos' XmlSchemaInclude', y está correctamente rellenado (con 1 include). –