Ecco un XSD:Uso XSD con include
<?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>
Ecco un secondo XSD che include quello di cui sopra:
<?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>
ho bisogno di leggere il (secondo) XSD in C# e:
- verifica che si tratta di un XSD valido e
- documenti Convalida contro di essa.
Ecco alcuni C# per leggere gli schemi:
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();
Il .Compile() fallisce perché "Tipo 'una: TheSimpleType' non è dichiarato, o non è un tipo semplice."
Tuttavia, funziona se:
- lo spazio dei nomi viene rimosso dallo schema, o
- lo spazio dei nomi viene aggiunto al includere.
La domanda è: come posso ottenere C# per accettarlo senza modificare gli schemi?
Sospetto che il problema sia che sebbene abbia inserito entrambi gli schemi in XmlSchemaSet, devo comunque dire a C# che uno è incluso nell'altro, cioè non ha funzionato da solo. Infatti, se dico solo a XmlSchemaSet l'XSD principale (e non l'inclusione) (entrambi senza (o con) spazi dei nomi), allora "Type" TheSimpleType "non è dichiarato, o non è un tipo semplice."
Quindi questa sembra essere una domanda sulla risoluzione include: come ?!
+1 mai saputo della classe 'XmlSchemaInclude'. Bella risposta. – psubsee2003
OK, bene. Ma ora supponiamo di dover determinare tutti gli include in fase di esecuzione, cioè, ti do un XSD arbitrario con include e devi andare a prenderli tutti. –
's = XmlSchema.Read (r, null);' Ora vedo che 's.Include', che sono oggetti' XmlSchemaInclude', ed è compilato correttamente (con l'inclusione di 1). –