我得到一个带有 XML 的字符串变量,并有一个 XSD 文件。我必须根据 XSD 文件验证字符串中的 XML,并且知道有不止一种方法(XmlDocument、XmlReader、...?)。
验证后我只需要存储 XML,所以我不需要它在 XDocument 或 XmlDocument 中。
如果我想要最快的性能,该怎么做?
我得到一个带有 XML 的字符串变量,并有一个 XSD 文件。我必须根据 XSD 文件验证字符串中的 XML,并且知道有不止一种方法(XmlDocument、XmlReader、...?)。
验证后我只需要存储 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);
我会选择带有 XmlReaderSettings 的 XmlReader,因为不需要在内存中加载完整的 XML。对于大型 XML 文件,它会更有效。
我认为最快的方法是使用 XmlReader 在文档被读取时对其进行验证。这使您可以仅通过一次验证文档:http: //msdn.microsoft.com/en-us/library/hdf992b8.aspx
使用XmlReader
配置来执行验证,源是TextReader
.
XmlReader
如果您不想依赖输入文档中的声明(带有XmlReaderSettings.Schemas
属性),您可以手动指定要使用的 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);
}