C# 根据多个架构验证未知xml,直到找到匹配项

C# 根据多个架构验证未知xml,直到找到匹配项,c#,xml,xsd,linq-to-xml,C#,Xml,Xsd,Linq To Xml,我已经将xml发送到一个网页,我想根据几个xsd进行验证,直到文件验证为止。当它进行验证时,我将能够根据管理验证它的模式来确定xml文件的类型 List<string> xsdList = new List<string>(); xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Enquiry.xsd"); xsdList.Add(_path + @"Handlers\DeviceSp

我已经将xml发送到一个网页,我想根据几个xsd进行验证,直到文件验证为止。当它进行验证时,我将能够根据管理验证它的模式来确定xml文件的类型

  List<string> xsdList = new List<string>();

  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Enquiry.xsd");
  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\FingerDeleted.xsd");
  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Heartbeat.xsd");
  xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Validation.xsd");

  XmlSchemaSet schemas = new XmlSchemaSet();

  foreach (string schema in xsdList)
  {
    var reader = new StringReader(File.ReadAllText(schema));
    schemas.Add("", XmlReader.Create(reader));
  }

  request.Validate(schemas, (o, e) =>
  {
    match = false;
  });
List xsdList=new List();
Add(_path+@“Handlers\devicespecificcandler\Schemas\Enquiry.xsd”);
添加(_path+@“Handlers\devicespecificcandler\Schemas\FingerDeleted.xsd”);
Add(_path+@“Handlers\devicespecificcandler\Schemas\Heartbeat.xsd”);
Add(_path+@“Handlers\devicespecificcandler\Schemas\Validation.xsd”);
XmlSchemaSet schemase=新的XmlSchemaSet();
foreach(xsdList中的字符串模式)
{
var reader=newstringreader(File.ReadAllText(schema));
schemas.Add(“,XmlReader.Create(reader));
}
验证(模式,(o,e)=>
{
匹配=假;
});
有人能帮忙吗,以上是我目前拼凑的,它当前抛出了一个错误'System.Xml.Schema.XmlSchemaValidationException:全局元素'interface'已经声明'


有没有一种方法可以返回成功的模式验证?

首先,您必须弄清楚哪些XSD文件可以放在一个文件集中。您得到的错误告诉您,同一元素“接口”的定义来自两个或多个不同的基本URI

如果您想动态地确定集合,那么您需要做一些工作。这是可能的,但不是微不足道的。这取决于XSD文件是否使用组合(include/import/redefine)。如果没有(简单的场景),那么为了将XSD文件放在一起,您必须单独加载每个XSD文件,构建所有全局定义内容(类型、元素、组、属性、属性组)的索引,然后将这些内容放在一起,这样,给定集合中的任何一对单独的XSD成员,交集都是空的。构建集合的策略取决于许多因素,性能和覆盖率仅为两个。基于这个简单的例子,您可以看到合成是如何变得重要的,因为现在即使交集不是空的,因为如果公共内容来自相同的URI,那么所有意图都将被视为空的

(我与之相关)有一个完整的引擎来处理上述问题,以便在“获取”任意XSD内容以进行分析、验证等时,为其XML模式重构引擎设置XML模式源集(或集合)

一旦确定了这些集合,就必须对这些模式的组成做出假设。换句话说,是什么构成了有效的XML文档元素集(有时并非所有全局元素定义都是有效的文档元素),以及每个文档元素应该使用什么模式集。很明显,您必须以某种方式处理这个问题,因为您有重复的元素

如果您想按照您的问题来处理它,那么只需循环使用如上所述构造的模式集

提出如何手动计算最佳集合的策略的最佳方法可能是可视化XSD文件之间的关系。下面是我从另一篇文章中看到的我如何使用可用的工具来理解它

来自:

“XmlSchemaSet中的架构通过XmlSchemaSet的Compile方法编译为一个逻辑架构。”

因此,为了针对多个单独的模式进行验证,应该为每个XSD创建一个
XmlSchemaSet

然后,您可以执行以下操作:

bool xmlIsValid = true;
XmlSchemaSet validatingSchema;
foreach (XmlSchemaSet schema in schemas) {
    xml.Validate(schema, (o, e) => { xmlIsValid = false; });
    if (xmlIsValid) {
        validatingSchema = schema;
        break;
    }
}

谢谢,这就解释了一切。我对XSD验证的理解还远远不够。