针对XSD验证XML的最高性能方法

时间:2010-09-08 10:59:16

标签: c# .net xml xsd xml-validation

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

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

如果我想要最快的表现,那么该怎么办?

4 个答案:

答案 0 :(得分:10)

其他人已经提到过进行验证的XmlReader类,我不会进一步详细说明。

您的问题没有详细说明。您是否会针对多个xml文档重复进行此验证,还是只进行一次?我正在阅读一个场景,你只是在验证很多xml文档(来自第三方系统?)并存储它们以备将来使用。

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

var xmlSchema = XmlSchema.Read(stream, null);
var xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add(xmlSchema);
xmlSchemaSet.Compile();

CachedSchemas.Add(name, xmlSchemaSet);

答案 1 :(得分:3)

我会选择使用XmlReaderSettings的XmlReader,因为不需要在内存中加载完整的XML。对于大型XML文件,它会更有效。

答案 2 :(得分:2)

我认为最快的方法是使用XmlReader来验证文档的读取时间。这使您只需一次验证文档:http://msdn.microsoft.com/en-us/library/hdf992b8.aspx

答案 3 :(得分:0)

使用已配置的XmlReader执行验证,来源为TextReader

如果您不想依赖输入文档中的声明(XmlReaderSettings.Schemas属性),您可以手动指定XmlReader要使用的XSD。

开始(仅假设输入文档中的XSD实例声明)将是:

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);
}