2009-02-21 8 views
11

Le code suivant m'aide à valider un fichier XML avec un schéma XSD.Validation Xml à l'aide du schéma XSD

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, xsdFilePath); 
settings.ValidationType = ValidationType.Schema; 
settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler); 
XmlDocument document = new XmlDocument(); 
document.Load(xmlFilePath); 
XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings); 

while (rdr.Read()) 
{ 

} 
isValid = true; 

Le ValidationEventHandler me dit aussi ce que les erreurs sont, mais ne me dit pas « où » ou « sur quelle ligne » ils se trouvent. Y at-il un moyen d'obtenir le numéro de ligne où le XML ne parvient pas à être validé?

Répondre

28

Ne serait-ce pas ce que vous cherchez?

Créez un objet XmlReaderSettings et activez les avertissements via cet objet.

Malheureusement, il semble qu'il n'y ait aucun moyen de transmettre votre propre objet XmlReaderSettings à XmlDocument.Validate().
Au lieu de cela, vous pouvez utiliser une validation XmlReader et un XmlNodeReader pour valider un existant XmlDocument (en utilisant un XmlNodeReader avec StringReader plutôt que d'un XmlDocument)

XmlDocument x = new XmlDocument(); 
x.LoadXml(XmlSource); 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.CloseInput = true;  
settings.ValidationEventHandler += Handler; 

settings.ValidationType = ValidationType.Schema; 
settings.Schemas.Add(null, ExtendedTreeViewSchema); 
settings.ValidationFlags = 
    XmlSchemaValidationFlags.ReportValidationWarnings | 
XmlSchemaValidationFlags.ProcessIdentityConstraints | 
XmlSchemaValidationFlags.ProcessInlineSchema | 
XmlSchemaValidationFlags.ProcessSchemaLocation ; 

StringReader r = new StringReader(XmlSource); 

using (XmlReader validatingReader = XmlReader.Create(r, settings)) { 
     while (validatingReader.Read()) { /* just loop through document */ } 
} 

Et le gestionnaire:

private static void Handler(object sender, ValidationEventArgs e) 
{ 
     if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) 
      System.Diagnostics.Trace.WriteLine(
      String.Format("Line: {0}, Position: {1} \"{2}\"", 
       e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)); 
} 
+2

+1 Complètement manqué e.Exception.LineNumber et e.Exception.LinePosition. – Elroy

+0

Pourquoi mettez-vous ceci dans un XmlDocument au début? Cela ne semble rien faire. –

+0

@JeremyHolovacs vrai, c'était juste une copie de l'une des réponses du forum 2007 (http://www.devnewsgroups.net/dotnetframework/t43762-catching-line-numbers-with-xmldocument-validate.aspx), et le commentaire suivant mentionné: "Cela fonctionne quand je supprime le' XmlDocument' et remplace 'XmlNodeReader' avec ' StringReader' " – VonC

3

ValidationEventArgs .Message inclut ligne/colonne dans son texte. ValidationEventArgs.Exception a des champs pour la ligne et la colonne.

Questions connexes