我正在尝试针对架构验证某些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 });
显然,这个解决方案还有很多不足之处。推荐的解决方法是什么?
答案 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));
}
});