验证XML与XSD的最佳性能方法

8
我得到了一个包含XML的字符串变量和一个XSD文件。我必须根据XSD文件验证字符串中的XML,并且知道有不止一种方法(XmlDocument,XmlReader等)。
验证后,我只需存储XML,因此不需要将其保存在XDocument或XmlDocument中。
如果我想要最快的性能,应该选择哪种方式?
4个回答

13

之前的答案中已经提到了使用 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
是的,我会验证并存储来自第三方系统的许多XML文档以供以后使用。XSD始终相同,因此您提供的编译模式集的提示非常感谢,谢谢! - Hinek
3
在这个例子中,“CachedSchemas”是什么? - Welton v3.62
1
只需要一个IDictionary<String, XmlSchemaSet>来缓存结果。 - sisve
你认为XmlSchemaSet为什么是线程安全的? - RichB
1
@RichB,那个例子正如我所描述的那样有效。初始化一个XmlSchemaSet,编译它,然后从多个线程中使用它。但是,我找不到任何支持我所说的内容的文档。 - sisve
您可能想要了解XmlReaderSettings.IgnoreCommentsIgnoreWhitespaceIgnoreProcessingInstructions; 我的测试仅适用于没有注释的XML文件,但如果您的文件包含大量注释,这可能有帮助(验证)。 - Christian Rondeau

3
我建议使用XmlReader和XmlReaderSettings进行翻译,因为它不需要在内存中加载完整的XML。对于大型XML文件,这将更加高效。

2

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接