4

我已将 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;
  });

任何人都可以帮忙,以上是我到目前为止拼凑的内容,它目前抛出错误'System.Xml.Schema.XmlSchemaValidationException:全局元素'interface'已经被声明'

有没有办法返回哪个模式验证成功?

4

2 回答 2

4

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

如果您想动态确定集合,那么您需要做一些工作。这是可能的,但这不是微不足道的。这取决于 XSD 文件是否使用组合(包括/导入/重新定义)。如果他们不这样做(简单的场景),那么为了将 XSD 文件放在一起,您必须单独加载每个 XSD 文件,建立所有全局定义的内容(类型、元素、组、属性、属性组)的索引,然后放入将这些集合在一起,使得给定集合的任何一对单独的 XSD 成员,交集是空的。构建一个集合的策略取决于许多因素,性能和覆盖范围只是两个。基于这个简单的案例,您可以看到组合变得多么重要,因为现在即使交叉点不为空,

QTAssistant(我与它相关联)有一个完整的引擎来处理上述问题,以便在“收集”任意 XSD 内容进行分析、验证等时为其 XML Schema Refactoring 引擎设置 XML Schema 源集(或集合) .

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

如果您想根据您的问题处理它,那么只需循环遍历如上构造的一组模式集。

想出关于如何手动找出最佳集合的策略的最佳方法可能是可视化 XSD 文件之间的关系。下面是我如何使用可用工具查看它的说明,来自 SO 上的另一篇文章。

在此处输入图像描述

于 2013-03-26T13:20:45.510 回答
1

http://msdn.microsoft.com/en-us/library/fe6y1sfe(v=vs.110).aspx

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

因此,要针对几个单独的架构进行验证,您应该XmlSchemaSet为每个 XSD 创建一个。

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

bool xmlIsValid = true;
XmlSchemaSet validatingSchema;
foreach (XmlSchemaSet schema in schemas) {
    xml.Validate(schema, (o, e) => { xmlIsValid = false; });
    if (xmlIsValid) {
        validatingSchema = schema;
        break;
    }
}
于 2014-01-08T02:58:25.173 回答