验证xml时获取模式信息

本文关键字:模式 信息 获取 xml 验证 | 更新日期: 2023-09-27 18:08:54

我正在尝试根据模式验证一些XML,并收集尽可能多的信息,以便向用户提供有价值的错误消息。

我已经成功地根据XSD验证了一个序列化的对象。我的ValidationEventHandler对所有错误都被正确调用我在那里得到一些信息。唯一的问题是模式信息在这一点上是不可用的—我试图得到元素的模式类型。例如,给定以下模式元素,我想获得"BookType"

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

我相信在验证过程中模式/验证信息被插入到xml中。因此,如果我在一行中调用validate两次,只在第二次调用时处理错误,那么模式信息是可用的。

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

显然,这个解决方案还有很多需要改进的地方。推荐的处理方法是什么?

验证xml时获取模式信息

XmlNode.SchemaInfo似乎会提供这些信息。

我假设当使用为执行XSD验证而创建的XmlReader加载XmlDocument时将填充此目录。

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

我找到解决办法了。

每次调用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));
                }
            });