Jest to podobne do tego pytania C# Get schema information when validating xmlprzechwytywania informacji Schema podczas walidacji XDocument
jednak pracuję z XDocument do celów LINQ.
Czytam/parsuję zestaw plików CSV i konwertuję do XML, a następnie sprawdzam poprawność kodu XML względem schematu XSD.
Chciałbym uchwycić konkretne błędy związane z wartościami elementów, wygenerować bardziej przyjazny dla użytkownika komunikat i przekazać je użytkownikowi, aby dane wejściowe mogły zostać poprawione. Jedną z pozycji, które chciałbym uwzględnić w danych wyjściowych, są niektóre informacje o schemacie (takie jak zakres dopuszczalnych wartości dla typu liczbowego).
W moim obecnym podejściu (które jestem otwarty na zmianę), jestem w stanie uchwycić wszystko, czego potrzebuję, z wyjątkiem informacji o schemacie.
Próbowałem uzyskać dostęp do SourceSchemaObject
w argumencie ValidationEventArgs
procedury obsługi zdarzenia Walidacja, ale zawsze jest to wartość pusta. Próbowałem również GetSchemaInfo
z XElement, który wydaje się być również zerowy.
Używam RegEx do identyfikowania konkretnych błędów sprawdzania poprawności, które chcę przechwycić, i przechwytywanie danych z XElement za pośrednictwem argumentu nadawcy obsługi zdarzenia sprawdzania poprawności. Myślałam przekształcania schematu do XDocument i chwytając co muszę poprzez LINQ, ale wydaje mi się, że nie powinno być lepszym rozwiązaniem
Oto moja obecna metoda sprawdzenia poprawności:
private List<String> this.validationWarnings;
private XDocument xDoc;
private XmlSchemaSet schemas = new XmlSchemaSet();
public List<String> Validate()
{
this.validationWarnings = new List<String>();
// the schema is read elsewhere and added to the schema set
this.xDoc.Validate(this.schemas, new ValidationEventHandler(ValidationCallBack), true);
return validationWarnings
}
i oto moja metoda zwrotna:
private void ValidationCallBack(object sender, ValidationEventArgs args)
{
var element = sender as XElement;
if (element != null)
{
// this is a just a placeholder method where I will be able to extract the
// schema information and put together a user friendly message for specific
// validation errors
var message = FieldValidationMessage(element, args);
// if message is null, then the error is not one one I wish to capture for
// the user and is related to an invalid XML structure (such as missing
// elements or incorrect order). Therefore throw an exception
if (message == null)
throw new InvalidXmlFileStructureException(args.Message, args.Exception);
else
validationWarnings.Add(message);
}
}
linia w mojej metody wywołania zwrotnego var message = FieldValidationMessage(element, args);
tylko zastępczy i nie istnieje jeszcze Celem tej metody jest to, aby zrobić 3 rzeczy:
zidentyfikować konkretne błędy sprawdzania poprawności za pomocą wyrażenia regularnego na
args.Message
(to już działa, ja testowałem wzorców, które mam zamiar korzystania)Grab wartości atrybutów z XDocument związanego z konkretnym Xelement który jest przyczyną błędu (takie jak numer wiersza i kolumny w oryginalnym pliku CSV)
Chwyć informacje o schemacie, jeśli są dostępne, aby typy pól i ograniczenia mogły zostać dodane do komunikatu wyjściowego.