Как получить недопустимый XMLNode в XmlReaderSettings.ValidationEventHandler в C # - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь создать собственное сообщение об ошибке для неудачной проверки XML с использованием события проверки обратного вызова. Я заметил, что отправителем объекта является XMLReader, и я получил Элемент или имя текущего узла от ((XmlReader) отправителя). Имя и сообщение об исключении из ValidationEventargs.Exception.Message. Я пытаюсь построить путь к текущему узлу, который не прошел проверку, получая родительские узлы текущего узла

Ниже приведен фрагмент кода

                  XmlReaderSettings xrs = new XmlReaderSettings();
                  xrs.ValidationEventHandler += new ValidationEventHandler(ValidationEvent);


                  public void ValidationEvent(object sender, ValidationEventArgs e)
                  {
                   XmlReader xe = (XmlReader)sender;
                    ValidationError ve = new ValidationError();
                    ErrorElement = xe.Name;
                    ErrorMessage = e.Exception.Message;
                    ErrorPath = ""\\want to build the Node path
                  }

1 Ответ

1 голос
/ 01 сентября 2012

В соответствии с этим потоком , вам нужно использовать XmlDocument.Validate.Вот мой код:

private static void ValidationErrorHandler(object sender, ValidationEventArgs e)
{
    if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning)
    {      
        string offendingElementName = BuildQualifiedElementName((e.Exception as XmlSchemaValidationException));
        // meaningful validation reporting code goes here
        Console.Out.WriteLine("{0} is invalid", offendingElementName);   
     }
}

private static string BuildQualifiedElementName(XmlSchemaValidationException exception)
{
    List<string> path = new List<string>();
    XmlNode currNode = exception.SourceObject as XmlNode;
    path.Add(currNode.Name);
    while (currNode.ParentNode != null)
    {
        currNode = currNode.ParentNode;
        if (currNode.ParentNode != null)
        {
            path.Add(currNode.Name);
        }
    }
    path.Reverse();
    return string.Join(".", path);
}
...