2017-08-26 57 views
0

我使用xsd.exe从xsd模式生成类。我无法控制架构。阅读,使用XmlSerlializer编写和序列化数据的验证工作得很好。 我想根据架构中的规则对包含用户输入的数据执行联机错误检查。再次,我没有任何问题序列化和验证反对,但后来我看不到追溯故障位置的简单方法,在哪个类的哪个实例发生。 我发现了一条评论,指出不存在XmlValidatingWriter的原因是这些类应该已经确保了模式兼容性,但是对于xsd.exe生成的类来说这不是真的。 (结构和类型不错,但是独特的领域,模式匹配等不包括在内) 有一个关于XmlSchemaValidator push-based validation的页面,但是这对我来说似乎超级手工,完全忽略了我所有的类都是xml序列化的事实。针对带有错误位置的XSD的C#数据验证

我发现了类似的问题,但没有人似乎有这个特定的目标,我也找不到能够让我找到解决方案的答案。我可以肯定,这是不可能的,因为某些原因 - 因为它现在看来我 - 但我想了解原因,并了解我的整个架构出了问题。

谢谢。

+0

大多数'XmlReader'实例实现['IXmlLineInfo'](https://msdn.microsoft.com/en-us/library/system.xml.ixmllineinfo.aspx)。 'XElement' [也实现这个](https://stackoverflow.com/a/4471030/3744182)。根据您验证XML的方式,您可以使用此方法来提取[本答案](https://stackoverflow.com/a/29882953/3744182)或[this one](https: //stackoverflow.com/a/621069/3744182)。你可以[编辑]你的问题分享一个[mcve]展示你如何验证你的XML? – dbc

+0

另外,'XmlSchemaException'有行和位置信息。它就在['XmlReaderSettings.ValidationEventHandler'](https://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.validationeventhandler(v = vs.110).aspx)中,所以你应该很好去。 – dbc

+0

另请参阅[如果未找到元素,可以使用C#中的XmlSerializer反序列化](https://stackoverflow.com/a/259969/3744182),以便在反序列化期间验证通用方法。验证失败将传递给一个['ValidationEventArgs'](https://msdn.microsoft.com/en-us/library/system.xml.schema.validationeventargs(v = vs.110).aspx),其中包含一个'XmlSchemaException' 。 – dbc

回答

1

好的,这是我最终做的。我并不以此为荣。

  1. 我有一个基类,我所有的xml节点都继承自它。我为它添加了一个GUID属性,该属性被标记为xmlattribute,并默认具有xmlignore属性,因此它不参与正常的序列化/反序列化。
  2. 当我即将序列化验证时,我创建了一个xmlattributesoverride来摆脱GUID属性的xmlignore。 guid将被序列化为每个元素的xml属性。
  3. 我创建一个新的XDocument并序列化到它。
  4. 我使用我需要验证的模式运行XDocument.Validate。
  5. 在验证事件处理程序中,我忽略了所有抱怨额外guid属性的错误。
  6. 当我得到一个真正的验证错误或警告,我可以找到实际的对象,被序列化到基于guid的特定元素。
  7. 利润。

可能非常低效但我与它的工作数据的大小没关系。