在XML验证期间访问架构信息

问题描述 投票:0回答:1

我有一些错误的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,无法针对其架构进行验证。错误几乎都是一样的-违反文档模型的空元素-但它们可能在数百个...

c# xml validation schema linq-to-xml
1个回答
0
投票

XmlSchemaValidationException.SourceObjectXmlSchemaValidationException.SourceObject的原因在null中进行了说明>>

[在验证实现docs接口的类,例如XmlSchemaValidationExceptionIXPathNavigable类的过程中抛出XPathNavigator时,XmlNode属性返回的对象是实现了该类的实例SourceObject界面。

[在验证期间通过验证的IXPathNavigable对象抛出XmlSchemaValidationException时,XmlReader属性的值为null。

© www.soinside.com 2019 - 2024. All rights reserved.