Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据XSD验证XML最有效的方法_C#_.net_Xml_Xsd_Xml Validation - Fatal编程技术网

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

C# 根据XSD验证XML最有效的方法,c#,.net,xml,xsd,xml-validation,C#,.net,Xml,Xsd,Xml Validation,我得到一个包含XML的字符串变量,并有一个XSD文件。我必须对照XSD文件验证字符串中的XML,并且知道有多种方法(XmlDocument、XmlReader等) 在验证之后,我只需要存储XML,所以我不需要将它存储在XDocument或XmlDocument中 如果我想要最快的性能,该怎么办?我会选择带有XmlReaderSettings的XmlReader,因为它不需要在内存中加载完整的XML。对于大的XML文件,它将更加有效。我认为最快的方法是使用XmlReader在读取文档时验证文档。这

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

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


如果我想要最快的性能,该怎么办?

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

我认为最快的方法是使用XmlReader在读取文档时验证文档。这允许您仅在一次过程中验证文档:

使用配置为执行验证的,源为

如果不想依赖输入文档中的声明(带属性),可以手动指定
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);
}

其他人已经提到了用于进行验证的
XmlReader
类,我将不再详细说明

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

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

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

CachedSchemas.Add(name, xmlSchemaSet);

是的,我验证并存储了大量来自第三方系统的xml文档,以供以后使用。XSD总是一样的,所以您的提示,编译模式集非常有用,谢谢!本例中的
CachedSchemas
是什么?只是一个用于缓存结果的IDictionary。为什么您认为XmlSchemaSet是线程安全的@RichB,这个例子和我描述的一样。初始化XmlSchemaSet,编译它,然后从多个线程中使用它。但是没有,在我能找到的任何文档中都没有支持我所说的内容。