2012-04-01 24 views
6

Sto lavorando con più oggetti XElement per fornire alcuni dati specificati dall'utente per diversi oggetti nella mia libreria. Sto cercando di evitare di specificare la struttura dell'intero file XML perché la libreria non dovrebbe preoccuparsi di come sia l'intero XML finché gli elementi specifici di cui ha bisogno sono strutturati correttamente.Convalida schema XML di XElement

A tal fine, ho 3 XSD file separati che definiscono schema per ognuna delle 3 XElements mie esigenze di classe, però io sono in esecuzione in alcuni problemi di dimostrare la validità del XElement rispetto allo schema. Non sembra essere un metodo per farlo senza una soluzione alternativa.

Dalla pagina MSDN, il metodo di estensione XElement.Validate() sembra essere adattato alla convalida dei sottoelementi di un file più grande. L'argomento XmlSchemaObject causa i miei problemi poiché non posso presumere che sia presente in uno qualsiasi degli XElements. Penso di poter aggirare questo problema afferrando lo XmlSchemaElement dal mio XmlSchemaSet per passare come argomento XmlSchemaObject, ma poiché lo XmlSchemaSet definisce già tutto, sembra strano doverlo fare.

Esiste un'opzione migliore per convalidare uno XElement con uno schema senza prima convalidare l'intero XDocument?

O dovrei semplicemente lasciare che il livello aziendale gestisca la convalida dello schema nell'applicazione e lasciare che la libreria assuma che lo XElement sia formato correttamente (ho considerato questa opzione, ma come preferenza personale preferisco evitare di lanciare eccezioni e preferirei semplicemente lasciare il metodo di chiamata sa che XElement non è valido tramite un parametro di ritorno).

risposta

9

Capisco il problema che si ha con l'API fornita, per quanto vedo ho due opzioni, una è quella di mettere il tuo XElement in un XDocument con ad es. XDocument doc = new XDocument(xElementToValidate); e quindi chiamare il numero the Validate method on that XDocument in cui tutto ciò che devi passare è il XmlSchemaSet, la seconda opzione è il modo in cui ti sei delineato, ovvero utilizzare il metodo Validate dello XElement, assicurandoti di passare lo XmlSchemaSet e la definizione dell'elemento radice in quello schema impostato come XmlSchemaObject. Se si tratta di schemi semplici con una sola definizione di elemento di livello superiore, tutto ciò che devi fare è ad es.

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

Se si avvolgono uno dei due approcci in un metodo allora non dovrebbe essere alcun sforzo più di chiamare un metodo comodo simile il framework .NET avrebbe potuto in dotazione.

+0

Non ho idea del motivo per cui non ho pensato di avvolgere il codice nel mio metodo di estensione 'XElement.Validate()'. Sembra così logico ora che lo dici. Creare un 'XDocument' è un'altra buona idea che avrebbe dovuto succedere anche a me (ho passato troppo tempo a cercare di capire come convertirlo, e ho perso l'ovvia soluzione). Sperimenterò con entrambi e vedrò quale preferisco. – psubsee2003

Problemi correlati