2013-02-26 6 views
8

Diciamo che ho uno schema con il quale voglio che un documento di input sia conforme. Carico il file secondo lo schema come questo:Come posso forzare la conformità con uno schema dato in .NET?

// Load the ABC XSD 
var schemata = new XmlSchemaSet(); 
string abcSchema = FooResources.AbcTemplate; 
using (var reader = new StringReader(abcSchema)) 
using (var schemaReader = XmlReader.Create(reader)) 
{ 
    schemata.Add(string.Empty, schemaReader); 
} 

// Load the ABC file itself 
var settings = new XmlReaderSettings 
{ 
    CheckCharacters = true, 
    CloseInput = false, 
    ConformanceLevel = ConformanceLevel.Document, 
    IgnoreComments = true, 
    Schemas = schemata, 
    ValidationType = ValidationType.Schema, 
    ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings 
}; 

XDocument inputDoc; 
try 
{ 
    using (var docReader = XmlReader.Create(configurationFile, settings)) 
    { 
     inputDoc = XDocument.Load(docReader); 
    } 
} 
catch (XmlSchemaException xsdViolation) 
{ 
    throw new InvalidDataException(".abc file format constraint violated.", xsdViolation); 
} 

Questo funziona bene nel rilevamento di errori banali nel file. Tuttavia, perché lo schema è bloccato per uno spazio dei nomi, un documento come il seguente non è valido, ma si insinua attraverso:

<badDoc xmlns="http://Foo/Bar/Bax"> 
    This is not a valid document; but Schema doesn't catch it 
    because of that xmlns in the badDoc element. 
</badDoc> 

vorrei dire che solo gli spazi dei nomi per i quali ho schemi dovrebbero passare la convalida dello schema.

risposta

2

così stupido come sembra, la cosa che si desidera guardare è in realtà sull'oggetto XmlReaderSettings:

settings.ValidationEventHandler += 
    (node, e) => Console.WriteLine("Bad node: {0}", node); 
+0

@codekaizen - hah, abbastanza giusto, questo è un esempio "migliore", anche se mi è piaciuto lo stupore implicito del mio originale :) – JerKimball

+0

concordato, ma ci può essere qualche motivo (ad esempio non cestinare l'intero stack e lo stato di analisi) per ma, visto che non è affatto stupefacente, spero che l'epiteto "stupido" si assumerà tutta la responsabilità di evidenziare questa svolta. – codekaizen

+0

@codekaizen Questo è estremamente diplomatico da parte tua; Rispetto raggiunto :) – JerKimball

1

La soluzione che ho finito per stabilirsi su è quello di verificare in sostanza che il nodo principale è nello spazio dei nomi Mi aspetto. Se non lo è, lo considero allo stesso modo in cui considero un vero errore di convalida dello schema:

// Parse the bits we need out of that file 
var rootNode = inputDoc.Root; 
if (!rootNode.Name.NamespaceName.Equals(string.Empty, StringComparison.Ordinal)) 
{ 
    throw new InvalidDataException(".abc file format namespace did not match."); 
} 
Problemi correlati