我需要针对一组XSD架构验证XML文档。有一个导入其他模式的顶级模式,嵌套模式也可能导入一些模式。例如,模式a.xsd导入b.xsd和c.xsd; b.xsd导入d.xsd。在此示例中,a.xsd是顶级架构。
我使用以下代码进行此类验证:
static void Main(string[] args)
{
try
{
var settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Schemas.Add("targetNs", "path/to/a.xsd");
settings.ValidationEventHandler += ValidateHandler;
var reader = XmlReader.Create("path/to/file.xml", settings);
while (reader.Read()) ;
}
catch (Exception ex)
{
throw ex;
}
}
private static void ValidateHandler(object sender, ValidationEventArgs e)
{
Console.WriteLine(e.Message);
}
虽然上面的代码使用嵌套模式进行评估,但是存在一个问题:如果某些嵌套模式是无效的XML文档,则会被忽略而没有任何例外。
你能帮我解决这个问题吗?
答案 0 :(得分:0)
如果您需要在验证文档之前验证架构,可以按照以下步骤进行验证:
try
{
using (FileStream fs = File.OpenRead("path/to/a.xsd"))
{
XmlSchema schema = XmlSchema.Read(fs, ValidateHandler);
}
}
catch (Exception e)
{
throw new Exception("Schema file is invalid. " + e.Message);
}
然后将架构添加到您的设置中,如下所示:
schema.TargetNamespace = "targetNs";
settings.Schemas.Addschema(schema);