c# - 针对多个模式验证未知 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\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’已经被声明”

有没有办法返回模式验证成功的结果?

最佳答案

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

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

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

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

如果你想按照你的问题处理它,那么只需循环遍历如上构造的模式集集。

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

enter image description here

关于c# - 针对多个模式验证未知 xml,直到找到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15633786/

相关文章:

android - 使用 XMLSerializer 将文本写入 XML,无需转义

java - 异常 cvc-elt.1 : Cannot find the declaration of element 'AsifXml' when trying to unmarshall using JAXB

php - PHP 中的 XSD 架构 1.1 验证

xsd 的 Java Saxon 有效子树

c# - DateTime.MinValue 和 SqlDateTime 溢出

c# - Azure 更新计划作业 API - 格式错误的作业对象

c# - 关于线程/后台 worker 的问题

xml - 我的xml文件未从root用户保存到cloudera中的hadoop

c# - 数轴的 C# 实现

java - 通过 HTTPS 的简单 Java Web 服务客户端