.NET を使用して XSD に対して FilePath で XML ファイルを検証する簡単なクラスを作成しました (以下を参照)。
LAN 上の別のマシンによって生成された大量のデータ ファイルがありますが、ファイルは真の XML ではなく、形式が正しくありませんが、毎回同じように、その構造に基づいて、コンテンツのグローバルな置換を行うことができます。ファイルを修正します。したがって、XSD でテストする前にこれらを修正する必要があります。などと交換<\
する必要</
があります。すべての置換はコードにリストされています。
これを、約 50k ファイルのリストでファイルを生成するマシンの LAN ネットワーク共有にポイントすると、完了するまでに約 15 分かかりました。これは LAN によって制限された IO にすぎないのか、それともここで行う置換よりも不正な XML を修正するためのより良い (より迅速な) 方法があるのか どうか疑問に思っています。
class VCheck
{
private static XmlReaderSettings settings = new XmlReaderSettings();
private bool valid;
string message;
public string Message { get { return message; } }
public VCheck()
{
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.Schemas.Add(null, "schema.xsd");
}
public bool CheckFile(string FileFullPath)
{
StreamReader file = new StreamReader(FileFullPath);
valid = true;
message = null;
try
{ //setup xml reader with settings
XmlReader xml = XmlReader.Create(new StringReader(@"<?xml version='1.0'?><root xmlns=""MYE"">" +
file.ReadToEnd().Replace(@"<\", @"</").Replace("&", "&").Replace("\"", """).Replace("'", "'") + "</root>"),
settings);
while (xml.Read()) ; //read in all xml, validating against xsd
}
catch
{
//problem reading the xml file in, bad path, disk error etc.
return false;
}
return valid;
}
void ValidationCallBack(object sender, ValidationEventArgs e) //called on failed validations
{
valid = false;
message = e.Message;
switch (e.Severity)
{
case XmlSeverityType.Error:
//Do stuff on validation error
break;
case XmlSeverityType.Warning:
//Do stuff on validation warning
break;
}
}
}
次のようにメインから呼び出します。
static void Main(string[] args)
{
VCheck checker = new VCheck();
foreach (string file in files) //files is a List<string> of file paths/names
{
if (!checker.CheckFile(file))
{
//To do stuff if not valid
}
}
}