我编写了一个快速类来验证 FilePath 上的 XML 文件与 .NET 的 XSD(见下文)。
我有大量数据文件由局域网上的另一台机器生成,但这些文件不是真正的 XML,它们格式错误,但每次都以相同的方式并根据它们的结构,我可以对内容进行一些全局替换文件来纠正它。所以我必须在用 XSD 测试之前纠正这些。我必须替换<\
为</
等等。所有替换都列在代码中。
当我将其指向生成文件的机器的 LAN 网络共享时,文件列表大约有 50k 个文件,这大约需要 15 分钟才能完成。我想知道这是否只是局域网限制的 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;
}
}
}
我会像这样从 main 调用它:
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
}
}
}