我有一些错误的XML,无法针对其架构进行验证。错误几乎都是一样的-违反了文档模型的空元素-但在文档中可能存在数百个不同元素时会发生。
我想要的解决方案是验证文档,从XElement列表中生成的异常对象(如果有)的SourceObject属性中捕获有问题的空元素,然后从文档中删除这些元素。但是,SourceObject属性始终为null。
阅读了一些相关内容之后,我了解到直到进行验证后,文档对象才会使用架构信息进行填充。但是,考虑到这一点,我仍然无法从验证过程中获得任何有用的信息,因为无论何时尝试访问它们,相关的对象属性始终为null。
这是我到目前为止的内容:
public void FixXml(string xmlDoc) { XDocument doc = XDocument.Parse(xmlDoc); XmlSchemaSet schema = new XmlSchemaSet(); schema.Add("", @"../../test.xsd"); schema.Compile(); doc.Validate(schema, (Callback)); foreach (XElement element in errors) { // This is where I'd start making changes to the document if the list didn't contain a bunch of nulls. } }
回调方法:((当我确信代码正常工作时,我可能会将其填充到lambda中。)>]
private void Callback(object sender, ValidationEventArgs eventArgs) { XmlSchemaValidationException ex = (eventArgs.Exception as XmlSchemaValidationException); if (ex != null) { XElement element = (ex.SourceObject as XElement); errors.Add(element); } }
This question及其答案对我很有用,我已经将一些解决方案应用于我自己的项目,但是它似乎仍然不起作用。我觉得我在这里缺少明显而愚蠢的东西。
谢谢。
我有一些错误的XML,无法针对其架构进行验证。错误几乎都是一样的-违反文档模型的空元素-但它们可能在数百个...
XmlSchemaValidationException.SourceObject
为XmlSchemaValidationException.SourceObject
的原因在null
中进行了说明>>
[在验证实现docs接口的类,例如
XmlSchemaValidationException
或IXPathNavigable
类的过程中抛出XPathNavigator
时,XmlNode
属性返回的对象是实现了该类的实例SourceObject
界面。[在验证期间通过验证的
IXPathNavigable
对象抛出XmlSchemaValidationException
时,XmlReader
属性的值为null。