2012-01-09 13 views
5

Sto provando a convalidare un frammento Xml utilizzando uno schema Xml con il metodo di estensione XDocument.Validate. Ogni volta che un frammento XML non valido viene utilizzato i fuochi ValidationEventHandler correttamente, tuttavia sia le proprietà LineNumber e LinePosition del XmlSchemaValidationException sono 0.XmlSchemaValidationException.LineNumber e LinePosition sono 0 durante la convalida di uno schema Xml con XDocument.Validate

private bool Validate(XDocument doc) 
{ 
    bool isValid = true; 
    List<string> validationErrors = new List<string>(); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 
    schemas.Add(null, "MyCustomSchema.xsd"); 

    doc.Validate(schemas, (sender, args) => 
    { 
     validationErrors.Add(String.Format("{0}: {1} [Ln {2} Col {3}]", 
      args.Severity, 
      args.Exception.Message, 
      args.Exception.LineNumber, 
      args.Exception.LinePosition)); 

     isValid = false; 
    }, false); 

    return isValid; 
} 

Il mio obiettivo nell'esempio di cui sopra è quello di utilizzare validationErrors per informare un utente sul motivo per cui il validazione fallita. Tuttavia, quando si utilizza questo metodo, LineNumber e LinePosition sono entrambi 0.

Lo snippet sembra abbastanza semplice e sembra funzionare come previsto in termini di convalida con entrambi i frammenti Xml validi e non validi.

Grazie in anticipo!

+0

Per quanto posso vedere, XmlSchemaValidator che viene istanziato utilizza solo una DummyPostion interna e non vedo un'opzione per ottenere un'implementazione migliore iniettata. – rene

risposta

4

Non si sta più convalidando la rappresentazione testuale dell'Xml ma il modello dell'oggetto. Di conseguenza non ci sono linee e posizioni perché non ci sono file ma XElement, XAttribute ecc. Oggetti in memoria. Un altro suggerimento utile è chiedersi: quale riga e posizione devono essere restituite se si è modificato (ad esempio è stato aggiunto un elmento) l'XDocument dopo il caricamento, ma prima di eseguire la convalida? Se non si sta creando o modificando l'Xml, il modo più rapido sarebbe utilizzare XmlReader per convalidare il documento Xml. Come bonus, se l'input è un file o uno stream, dovresti ottenere informazioni sulla linea e sulla posizione in caso di errori di convalida.

+0

Pawel, grazie per la tua risposta molto ragionevole. Volevo convalidare contro l'XDocument, poiché avevo già un riferimento. Cambierò la mia app per convalidare un XmlReader, quindi creerò il riferimento XDocument quando necessario. – buckindb

+0

Penso che dovresti essere in grado di fare entrambe le cose contemporaneamente: puoi impostare il lettore in modo che convalidi il documento e poi passi il lettore al metodo XDocument.Load() ... – Pawel

Problemi correlati