c# - 如何在针对模式验证的 XDocument 中查找无效的 XML 节点(XmlSchemaValidationException.SourceObject 为空)

标签 c# validation xsd linq-to-xml

我有一个根据 XML 模式验证的 XDocument。当 XDocument 无效时,我需要找到无效的 XML 节点,以便用户可以轻松导航到我的应用程序中的相应位置(例如,通过双击消息网格上的消息)。

为此,我使用了 System.Xml.Schema.Validate() 扩展方法。 Validate() 方法的第二个参数是 System.Xml.ValidationEventHandler,它会在每个无效的 XML 元素上调用。它传递 System.Xml.ValidationEventArgsValidationEventArgs.Exception 可以转换为 System.Xml.Schema.XmlSchemaValidationException。现在 XmlSchemaValidationException 有一个属性 SourceObject,我希望它包含对无效 XML 节点的引用。不幸的是,它始终为空。

以下片段说明了我的用法:

XDocument doc = XDocument.Load(@"c:\temp\booksSchema.xml");

// Create the XmlSchemaSet class.
XmlSchemaSet sc = new XmlSchemaSet();

// Add the schema to the collection.
sc.Add("urn:bookstore-schema", @"c:\temp\books.xsd");

// Validate against schema
doc.Validate(sc, delegate(object sender, ValidationEventArgs e)
                {
                    XmlSchemaValidationException ve = e.Exception as XmlSchemaValidationException;
                    if (ve != null)
                    {
                        object errorNode = ve.SourceObject;    
                        // ve.SourceObject is always null
                    }
                });

验证本身工作正常,但我无法在无效节点上获得引用。奇怪的是,同样的方法适用于 System.Xml.XmlDocument,但不幸的是我必须在这种情况下使用 XDocument

有没有人建议如何在 XDocument 中找到无效节点?

最佳答案

好的,我有答案了。无效节点是事件处理程序的“发送者”本身。它可以转换为 XContainer、XElement、...

关于c# - 如何在针对模式验证的 XDocument 中查找无效的 XML 节点(XmlSchemaValidationException.SourceObject 为空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446502/

相关文章:

php - laravel 中特定字段的自定义验证消息

xml - XML Schema 中的枚举定义是多余的

xsd - 将属性设置为 XML 模式中的所有类型

java - SonarQube 抛出 '' NullPointer 异常可能会抛出“对于从 xsd 文件在 java 文件中创建的变量的错误”

c# - 如何使 CloudConfigurationManager.GetSetting 更简洁?

c# - 使用 iTextsharp 在没有 Acrofields 的情况下编辑 pdf 模板

c# - 在 Windows 服务中持久化变量的公认方法是什么

php - Bootstrap HTML + MySQL PHP 表单安全

c# - 根据用户未输入的数据验证模型

c# - 在 C++/CLI 中处理 C# 异常