【问题标题】:How to get invalid XMLNode in XmlReaderSettings.ValidationEventHandler in C#如何在 C# 的 XmlReaderSettings.ValidationEventHandler 中获取无效的 XMLNode
【发布时间】:2012-02-11 15:14:27
【问题描述】:

我正在尝试使用回调验证事件为不成功的 XML 验证构建自定义错误消息。我注意到元素的发送者对象是 XMLReader,我从 ((XmlReader)sender).Name 和 ValidationEventargs.Exception.Message 中获取了元素或当前节点名称和异常消息。我试图通过获取当前节点的父节点来构建验证失败的当前节点的路径

下面给出的是代码sn-p

                  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
                  }

【问题讨论】:

    标签: validation xml-parsing xmlreader xmlnode


    【解决方案1】:

    根据thread,您需要改用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2010-12-08
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多