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