验证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 });
显然,这个解决方案还有很多需要改进的地方。推荐的处理方法是什么?
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));
}
});