C#在验证xml时获取架构信息

时间:2011-09-19 09:35:13

标签: c# .net xml validation schema

我正在尝试针对架构验证某些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 });

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

2 个答案:

答案 0 :(得分:0)

XmlNode.SchemaInfo似乎会提供此信息。

我假设在使用为创建XSD验证而创建的XmlDocument加载XmlReader时会填充此内容。

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

答案 1 :(得分:0)

我找到了解决方案。

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

            });