2010-11-24 5 views
0

je le code suivant qui valide avec succès un fichier XML par rapport à un schéma XSD:Comment obtenir la position du fichier d'une erreur XSD dans le fichier XML?

Try 

     Dim val As New Xml.XmlReaderSettings With {.ValidationType = ValidationType.Schema} 
     val.Schemas.Add(Nothing, "myvalidator.xsd") 

     Using reader = XmlReader.Create("myfile.xml", val) 
      While reader.Read 
      End While 
     End Using 

     Console.WriteLine("XML validation succeeded.") 

    Catch ex As Exception 
     Console.WriteLine("XML validation failed." & vbCr & vbLf & "Error Message: " & ex.Message) 
    End Try 

Une erreur d'exemple que je reçois est

The element 'address' has invalid child element 'zip_code'. List of possible elements expected: 'address_line_2, address_line_3, city'. 

Quand je valider un grand fichier XML avec des centaines de membres qui ont chacun plusieurs adresses, ce n'est pas assez d'informations pour identifier le problème. Existe-t-il un moyen d'obtenir un numéro de ligne, une position de fichier ou d'autres données utiles pour savoir exactement où se trouve le problème dans le fichier XML d'origine? Je réalise que XmlReader ne lit pas le fichier de la même manière qu'un lecteur de texte, et que le XML peut être bien formaté ou sur une ligne géante, donc les numéros de ligne ne sont pas forcément le chemin à parcourir. Il semblerait que je devrais être capable de faire quelque chose à l'intérieur de la boucle While pour savoir où est le problème, mais je ne l'ai pas encore trouvé.

Répondre

1

Tout d'abord, n'utilisez pas "ex.Message". Il ne montre que le texte de l'exception de niveau supérieur. Utilisez ex.ToString() à la place.

Ensuite, regardez les propriétés du XmlReader au moment de l'exception. En outre, regardez attentivement toutes les propriétés du XmlException que vous êtes passé. Il a LineNumber et LinePosition propriétés.

+0

Parfait. J'avais oublié de piéger le type d'erreur spécifique, donc je ne regardais que les propriétés du gestionnaire d'exceptions générique, et non le gestionnaire XmlSchemaValidationException spécifique, donc je ne voyais pas les propriétés supplémentaires comme LineNumber et LinePosition, qui sont exactement ce que je avoir besoin. Merci! – gfrizzle

Questions connexes