Saxon APIを使用したXSD検証
-
28-10-2019 - |
質問
Saxonを使用してXSD検証をテストしようとしています。実際の検証に到達すると、validator.run()が最初のエラーに到達したときに例外をスローし、その後続けないため、最初のエラーのみがキャッチされます。これは、多くのエラーを備えたXMLファイルを持っているときに望むものではありません。例外がスローされた後に検証を継続する方法はありますか、それともSaxonを使用した別の検証方法がありますか?
このコードは、Saxonがドキュメントのサンプルフォルダーに持っている検証の1つの例に基づいており、これが検証を実行するセクションです。
SchemaValidator validator = manager.NewSchemaValidator();
using (Stream xmlFile = File.OpenRead(fileName))
{
using (XmlReader xmlValidatingReader = XmlReader.Create(xmlFile))
{
validator.SetSource(xmlValidatingReader);
validator.ErrorList = new ArrayList();
try
{
validator.Run();
}
catch (Exception)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Instance validation failed with " + validator.ErrorList.Count + " errors");
foreach (StaticError error in validator.ErrorList)
{
sb.AppendLine("At line " + error.LineNumber + ": " + error.Message);
tbXsdOutput.Text = sb.ToString();
}
return;
}
}
}
解決
Saxonicaを複数のエラーを返すように構成した方法は次のとおりです。
proc.SetProperty(net.sf.saxon.lib.FeatureKeys.VALIDATION_WARNINGS,"true");
以下の作業コード:
static void Main(string[] args)
{
try
{
errors = new ArrayList();
Saxon.Api.Processor proc = new Processor(true);
proc.SetProperty(net.sf.saxon.lib.FeatureKeys.VALIDATION_WARNINGS,"true");
//this is the property to set!
SchemaManager schemaManager = proc.SchemaManager;
FileStream xsdFs = new FileStream(@"C:\path\to.xsd", FileMode.Open);
schemaManager.Compile(XmlReader.Create(xsdFs));
SchemaValidator schemaValidator = schemaManager.NewSchemaValidator();
FileStream xmlFs = new FileStream(@"C:\path\to.xml", FileMode.Open);
schemaValidator.SetSource(XmlReader.Create(xmlFs));
schemaValidator.ErrorList = errors;
schemaValidator.Run();
}
catch(net.sf.saxon.type.ValidationException e)
{
foreach(StaticError error in errors)
{
Console.WriteLine(error.ToString());
}
Console.ReadKey(true);
Environment.Exit(0);
}
foreach (StaticError error in errors)
{
Console.WriteLine(error.ToString());
}
Console.ReadKey(true);
}
あなたはについてもっと見ることができます VALIDATION_WARNINGSオプションはこちら.
所属していません StackOverflow