Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XDocument更改模式_C#_Xml_Validation_Xsd_Linq To Xml - Fatal编程技术网

C# XDocument更改模式

C# XDocument更改模式,c#,xml,validation,xsd,linq-to-xml,C#,Xml,Validation,Xsd,Linq To Xml,我正在使用XSD文件开发一个XML验证程序。必须使用任何XSD文件验证XML,这意味着必须将XSD模式添加到XML文件中,但当然必须首先从XML中删除模式(如果存在)。 我的解决方法: -我正在使用递归成功地从XML文件中删除模式 -我正在成功地将XSD模式添加到XML中 我遇到的问题是验证: XDocument doc = XDocument.Load(filename); /*递归添加/删除模式*/ doc.Save("temp.xml"); using (XmlReader reade

我正在使用XSD文件开发一个XML验证程序。必须使用任何XSD文件验证XML,这意味着必须将XSD模式添加到XML文件中,但当然必须首先从XML中删除模式(如果存在)。 我的解决方法:

-我正在使用递归成功地从XML文件中删除模式

-我正在成功地将XSD模式添加到XML中

我遇到的问题是验证:

XDocument doc = XDocument.Load(filename);
/*递归添加/删除模式*/

doc.Save("temp.xml");

using (XmlReader reader = XmlReader.Create("temp.xml", settings))
       doc = XDocument.Load(reader, LoadOptions.SetLineInfo);
我使用XmlReader而不是.Validate()方法的原因是我需要突出显示实际的错误行,.Validate()方法不会从ValidationEventHandler异常返回行号


是否有其他方法可以更改XML的模式,并且仍然通过行验证它,而不将新xml保存到临时文件?

我不明白…在
ValidationEventHandler
中,您会得到
ValidationEventArgs
,它具有
Exception
属性,具有
LineNumber
LinePosition
。当然,如果您要根据架构验证,而不是检查它是否格式正确(这是
XDocument.Load()
应该做的唯一事情,好的)

关于针对任意模式的验证:有一个添加了重载的
Validate()
,您可以在其中指定另一个模式。不幸的是,由于一些模糊的原因,行号信息丢失。但是,您可以在读取期间执行验证。首先,定义要使用的架构:

var schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xmlSchema)));
然后创建一个
XmlReaderSettings
来应用您的模式:

var settings = new XmlReaderSettings();
settings.Schemas = schemas;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += (sender, e) => 
    Console.WriteLine($"{e.Exception.LineNumber}: {e.Message}");
然后加载文档,它将具有所需的信息:

using (var reader = XmlReader.Create(stream, settings))
{
    var doc = XDocument.Load(reader, LoadOptions.SetLineInfo);
|

这也可以,但问题是,如果我这样验证,LineNumber属性始终返回0,并且我正在使用SetLineInfo加载选项,但不起作用。请让我了解,您使用加载(…,LoadOptions.SetLineInfo)加载,并使用验证(…)验证,行号始终为0?是,就这样,谢谢你的回答。原来根本不需要添加/删除模式。好的,我明白你的意思。嗯,在加载过程中只需移动验证。更新答案。