代码之家  ›  专栏  ›  技术社区  ›  Hinek

根据XSD验证XML最有效的方法

  •  7
  • Hinek  · 技术社区  · 15 年前

    我得到一个包含XML的字符串变量,并有一个XSD文件。我必须对照XSD文件验证字符串中的XML,并且知道有多种方法(XmlDocument、XmlReader……?)。

    在验证之后,我只需要存储XML,所以我不需要将它存储在XDocument或XmlDocument中。

    如果我想要最快的表演怎么办?

    4 回复  |  直到 10 年前
        1
  •  12
  •   sisve    15 年前

    其他人已经提到了 XmlReader

    你的问题没有详细说明上下文。您将对多个xml文档重复执行此验证,还是只执行一次?我正在读一个场景,您正在验证大量的xml文档(来自第三方系统?)储存起来以备将来使用。

    我对性能搜索的贡献是使用编译的 XmlSchemaSet 这将是线程安全的,因此多个线程可以重用它,而无需再次解析xsd文档。

    var xmlSchema = XmlSchema.Read(stream, null);
    var xmlSchemaSet = new XmlSchemaSet();
    xmlSchemaSet.Add(xmlSchema);
    xmlSchemaSet.Compile();
    
    CachedSchemas.Add(name, xmlSchemaSet);
    
        2
  •  3
  •   Johann Blais    15 年前

        4
  •  0
  •   g t Omri Btian    10 年前

    使用 XmlReader TextReader .

    您可以手动指定 XmlReaderSettings.Schemas 财产)

    var settings = new XmlReaderSettings {
       ConformanceLevel = ConformanceLevel.Document,
       ValidationType = ValidationType.Schema,
       ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation |
                         XmlSchemaValidationFlags.ProcessInlineSchema,
    };
    
    int warnings = 0;
    int errors = 0;
    settings.ValidationEventHandler += (obj, ea) => {
       if (args.Severity == XmlSeverityType.Warning) {
          ++warnings;
       } else {
          ++errors;
       }
    };
    
    XmlReader xvr = XmlReader.Create(new StringReader(inputDocInString), settings);
    
    try {
       while (xvr.Read()) {
          // do nothing
       }
    
       if (0 != errors) {
          Console.WriteLine("\nFailed to load XML, {0} error(s) and {1} warning(s).", errors, warnings);
       } else if (0 != warnings) {
          Console.WriteLine("\nLoaded XML with {0} warning(s).", warnings);
       } else {
          System.Console.WriteLine("Loaded XML OK");
       }
    
       Console.WriteLine("\nSchemas loaded durring validation:");
       ListSchemas(xvr.Schemas, 1);
    
    } catch (System.Xml.Schema.XmlSchemaException e) {
       System.Console.Error.WriteLine("Failed to read XML: {0}", e.Message);
    } catch (System.Xml.XmlException e) {
       System.Console.Error.WriteLine("XML Error: {0}", e.Message);
    } catch (System.IO.IOException e) {
       System.Console.Error.WriteLine("IO error: {0}", e.Message);
    }