C# 如何从xml模式验证c中获取xpath和数据值#

C# 如何从xml模式验证c中获取xpath和数据值#,c#,xml,xpath,xsd,C#,Xml,Xpath,Xsd,根据我们的要求,我需要捕获每个模式验证问题(错误和警告)的xpath和数据值。以下是我的代码-如何获取当前节点的xpath和xml中的无效数据值(如果可能的话)以及行号和数据位置的任何帮助 XmlReaderSettings readerSettings = new XmlReaderSettings(); readerSettings.Schemas.Add("http://www.example.com\products", "Schema.xsd");

根据我们的要求,我需要捕获每个模式验证问题(错误和警告)的xpath和数据值。以下是我的代码-如何获取当前节点的xpath和xml中的无效数据值(如果可能的话)以及行号和数据位置的任何帮助

XmlReaderSettings readerSettings = new XmlReaderSettings();
            readerSettings.Schemas.Add("http://www.example.com\products", "Schema.xsd");
            readerSettings.ValidationType = ValidationType.Schema;
            readerSettings.ValidationEventHandler += new ValidationEventHandler(readerSettings_ValidationEventHandler);
            using (XmlReader xmlReader = XmlReader.Create(new StringReader(submissionXML), readerSettings))
            {
                while (xmlReader.Read()) { }
            }



 void readerSettings_ValidationEventHandler(object sender, ValidationEventArgs e)
            {
                XmlReader reader = ((XmlReader)sender);
                //can I get xpath and data value from the reader
                //I can get the element name

                if (e.Severity == XmlSeverityType.Warning)
                {
                    Console.Write("WARNING: ");
                    Console.WriteLine(e.Message);
                }
                else if (e.Severity == XmlSeverityType.Error)
                {
                    Console.Write("ERROR: ");
                    Console.WriteLine(e.Exception.LineNumber.ToString() +"-"+ e.Exception.LinePosition.ToString() +"-"+ e.Message);
                }
            }
尝试:


通过使用
XmlReader
类,您无法直接访问元素的XPath表达式


您可以在代码中开箱即用的是的
LineNumber
LinePosition
属性。

s是否有其他执行模式验证的方法(xmlreader除外),以便获得xpath和数据值?您可以在阅读XML文档时尝试自己构建xpath,通过在读取开始元素时将当前元素的名称等添加到堆栈中,并在读取结束元素时将其弹出。请参阅
XmlDocument xdoc = XmlDocument.Load(reader);
var nav = xdoc.CreateNavigator();
XPathNodeIterator navReader = nav.Select("Insert Xpath here");
while (navReader.MoveNext())
{
    var value = navReader.Current.Select("Insert Xpath for Value here");
}