c# - XDocument 更改模式

标签 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 reader = XmlReader.Create("temp.xml", settings))
       doc = XDocument.Load(reader, LoadOptions.SetLineInfo);

我使用 XmlReader 而不是 .Validate() 方法的原因是我需要突出显示实际的错误行,而 .Validate() 方法不会从 ValidationEventHandler 异常中返回 LineNumber。

是否有另一种方法来更改 XML 的架构,并且仍然通过行验证它而不将新的 xml 保存到临时文件?

最佳答案

我不明白...在 ValidationEventHandler 中,您得到 ValidationEventArgs,它有一个 Exception 属性和 LineNumberLinePosition。当然,如果您要针对模式验证,而不是检查它是否格式正确(这是 XDocument.Load() 应该做的唯一事情,AFAIK)。

关于针对任意模式的验证:有一个 extension method其中添加 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);
|

关于c# - XDocument 更改模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44719056/

相关文章:

ajax - 在Grails中应用服务器端Javascript验证

xml - 验证XPath表达式

c# - 从 XElement 中获取 2 个属性来创建字典 LINQ

c# - 如何获得重叠的 3 x 3 字符串的单词?

c# - BinaryFormatter 忽略程序集版本

c# - 检查Keys是否为字母/数字/特殊符号

javascript - js中访问包含冒号的对象元素

JAVA发送包含XML字符串的Post请求

xml - Spring : how to expose SimpMessagingTemplate bean to root context ?

c# - 为 TextBox 控件引发了哪些验证事件?