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);
完全なXMLをメモリにロードする必要がないため、XmlReaderSettingsを使用してXmlReaderを選択します。大きなXMLファイルの場合はより効率的です。
最速の方法は、読み取られているドキュメントを検証する XmlReader を使用することだと思います。これにより、1 回のパスでドキュメントを検証できます: http://msdn.microsoft.com/en-us/library/hdf992b8.aspx
XmlReader
ソースがTextReader
.
XmlReader
入力ドキュメントの宣言に依存したくない場合は、使用するXSD を手動で指定できます(XmlReaderSettings.Schemas
プロパティを使用) 。
開始 (入力ドキュメント内の 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);
}