2010-11-24 4 views
0

Ich habe den folgenden Code, die eine XML-Datei gegen ein XSD-Schema erfolgreich validiert:Wie bekomme ich die Dateiposition eines XSD-Fehlers in der XML-Datei?

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 

Eine Probe Fehler Ich erhalte ist

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

Wenn ich die Validierung eine große XML-Datei mit Hunderte von Mitgliedern, die jeweils mehrere Adressen haben, sind nicht genug Informationen, um das Problem zu lokalisieren. Gibt es eine Möglichkeit, eine Zeilennummer oder Dateiposition oder andere hilfreiche Daten zu erhalten, um zu wissen, wo genau das Problem in der ursprünglichen XML-Datei auftritt? Ich stelle fest, dass XmlReader die Datei nicht auf die gleiche Weise liest wie ein Textleser, und das XML könnte schön formatiert sein oder auf einer riesigen Zeile, so dass Zeilennummern nicht unbedingt der richtige Weg sind. Es scheint, als ob ich in der Lage sein könnte, etwas in der Schleife zu tun, um zu wissen, wo das Problem liegt, aber ich habe es noch nicht gefunden.

Antwort

1

Zuerst nicht "ex.Message" verwenden. Es zeigt nur den Text der Ausnahme der obersten Ebene. Verwenden Sie stattdessen ex.ToString().

Zweitens, betrachten Sie die Eigenschaften des XmlReader zum Zeitpunkt der Ausnahme. Sehen Sie sich auch alle Eigenschaften des XmlException an, die Sie übergeben haben. Es hat LineNumber und LinePosition Eigenschaften.

+0

Perfekt. Ich hatte vergessen, den spezifischen Fehlertyp zu erfassen, so dass ich nur die Eigenschaften für den generischen Exception-Handler und nicht den spezifischen XmlSchemaValidationException-Handler betrachtete, sodass ich die zusätzlichen Eigenschaften wie LineNumber und LinePosition nicht sah, die genau das sind brauchen. Vielen Dank! – gfrizzle

Verwandte Themen