C#验证xml时获取模式信息

问题描述:

我试图根据模式验证一些XML并收集尽可能多的信息以向用户提供有价值的错误消息。C#验证xml时获取模式信息

我已经成功地验证对一个XSD序列化对象。我的ValidationEventHandler被正确调用了所有的错误,并且我得到了一些信息。唯一的问题是模式信息在这一点上是不可用的 - 我试图去到元素的模式类型。即给出下面的架构元素,我想获得“的BookType”

<element minOccurs="0" maxOccurs="1" name="TypeOfBook" type="myTypes:BookType" /> 

我相信架构/验证信息被插入在验证过程中的XML。因此,如果我连续调用两次验证,则只能在第二次处理错误时使用模式信息。

serializedObject.Validate((x, y) => { }); 
serializedObject.Validate((x, y) => { // handle errors here because elements will have schema info available }); 

很明显,这个解决方案有很多不足之处。推荐的处理方法是什么?

我找到了解决方案。

每次的ValidationEventHandler被调用,添加XmlSchemaValidationException.SourceObject XMLELEMENT到列表中。一旦验证完成,架构信息将被添加到这些对象中,使我能够访问信息。即Element.SchemaInfo.SchemaType.Name。

的XmlSchemaValidationException被传递到与属性“SourceObject”这是一个XmlElement的事件处理程序。

  List<XmlElement> errorElements = new List<XmlElement>(); 

      serializedObject.Validate((x, y) => 
      { 
       var exception = (y.Exception as XmlSchemaValidationException); 

       if (exception != null) 
       { 
        var element = (exception.SourceObject as XmlElement); 

        if (element != null) 
         errorElements.Add(new XmlValidationError(element)); 
       } 

      }); 

XmlNode.SchemaInfo好像它会提供该信息。

我认为这会在使用创建的XmlReader加载XmlDocument执行XSD验证时填充。

但是,在执行验证错误处理程序(XmlReaderSettings.ValidationEventHandler)时,在与ValidationEventArgs一起传递的XmlSchemaException实例中只有有限的信息可用。特别是在输入文档中没有XmlNode或类似的引用。然而,提到了SourceSchemaObject

+0

我正在使用XmlSerializer将对象序列化为xml。然后我想验证xml是否适用于xsd。在第一次调用验证期间,绝对没有可用的模式信息(所有与模式相关的porperties都为空)。在第二个电话。所有的信息都在那里。 – Craigt