首页 文章

XDocument更改架构

提问于
浏览
2

我正在使用带有XSD文件的XML验证器 . XML必须使用任何XSD文件进行验证,这意味着必须将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保存到临时文件?

1 回答

  • 1

    我不明白......在 ValidationEventHandler 中你得到 ValidationEventArgs ,其 Exception 属性为 LineNumberLinePosition . 当然,如果你对一个模式是 validating ,而不是检查它是否格式正确(这是 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);
    |
    

相关问题