我得到了一个包含XML的字符串变量和一个XSD文件。我必须根据XSD文件验证字符串中的XML,并且知道有不止一种方法(XmlDocument,XmlReader等)。
验证后,我只需存储XML,因此不需要将其保存在XDocument或XmlDocument中。
如果我想要最快的性能,应该选择哪种方式?
验证后,我只需存储XML,因此不需要将其保存在XDocument或XmlDocument中。
如果我想要最快的性能,应该选择哪种方式?
之前的答案中已经提到了使用 XmlReader
类来进行验证,我不会对此展开更多讲解。
你的问题并没有具体说明上下文。你是要对多个 XML 文档进行重复验证,还是只需要一次?我理解的场景是你需要验证很多 XML 文档(来自第三方系统?)并将它们存储以备将来使用。
我的贡献是提供一种性能优化方法,即使用已编译的 XmlSchemaSet
,这样可以确保线程安全,多个线程可以重用它而无需再次解析 xsd 文档。
var xmlSchema = XmlSchema.Read(stream, null);
var xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add(xmlSchema);
xmlSchemaSet.Compile();
CachedSchemas.Add(name, xmlSchemaSet);
使用已配置完成验证的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);
}
XmlReaderSettings.IgnoreComments
,IgnoreWhitespace
和IgnoreProcessingInstructions
; 我的测试仅适用于没有注释的XML文件,但如果您的文件包含大量注释,这可能有帮助(验证)。 - Christian Rondeau