如何验证一个 XSD 架构是另一个 XSD 架构的子集?

2024-04-17

如何验证一个 XSD 架构是否是另一个 XSD 架构的子集?

我们正在使用“蓝图”XSD 模式的集合(定义子组件可用的所有可能的输入或输出)创建一个系统应用程序。许多子组件正在被实现,并且这些子组件使用 XML 文件在它们之间传递数据。每个子组件都会创建相关蓝图 XSD 架构的子集(以指示它选择实现哪些可能的输入或输出)。针对子集 XSD 架构进行验证的任何 XML 数据文件也必须针对蓝图 XSD 架构进行验证,但反之则不然(因为子集 XSD 架构可能不包含蓝图 XSD 架构中的所有“可选”或“选择”XML 元素,并且它可以选择进一步限制现有 XML 标记上允许的数据值)。系统将根据子组件的子集 XSD 架构验证该子组件的所有 XML 输入(以标记任何错误输入并隔离数据相关问题的根源)。

在测试期间,我们打算验证每个子组件的子集 XSD 架构确实是关联蓝图 XSD 架构的子集,但我们没有执行此验证的自动化方法。这些 XSD 模式相当大且难看,需要手动进行此测试。最好有一种“根据 XSD 文件 2 验证 XSD 文件 1”命令,类似于 Java 如何根据 XSD 模式执行 XML 文件验证。我们想要确认每个子组件的子集 XSD 架构将不允许任何违反蓝图 XSD 架构的 XML 输入/输出组合。借助这种模式到模式的功能,验证子组件 A 的输出 XML 是否适合用作子组件 B 的输入也非常有帮助(我们可以轻松地根据 XSD 模式验证单个输出 XML,但是我们想要确认子组件 A 的所有可能的 XML 输出都将根据子组件 B 的 XSD 架构进行验证)。

有用信息:此应用程序是作为 OSGi 捆绑包实现并使用 Maven 2.2.1 编译/执行的 Java 6 应用程序的集合。没有使用任何特定开发 IDE 的要求。该系统正在 Microsoft Windows XP 环境中进行测试,但也计划在其他环境中执行该系统(因此首选跨平台解决方案)。


确保所需关系的最简单方法是通过限制蓝图模式类型来派生子集模式的类型。不过,听起来那艘船似乎已经起航了。

和这里的其他人一样,我不知道有任何工具可以开箱即用地执行此操作(尽管如果 Petru Gardea 说 QT Assistant 可以,那么值得跟进)。

一个复杂之处在于,有两种不同的方式来查看要验证的子集/超集关系:(1) 模式 1 接受为有效的每个文档(或元素)也被模式 2 接受为有效(不参考类型)所做的分配),或(2)针对模式 1 和 2 通过验证(规范中称为后模式验证信息集)生成的类型化文档彼此之间存在适当的关系:如果元素或属性在树1,在树2中有效;树 1 中分配给它的类型是树 2 中分配给它的类型的限制;等等。如果模式 1 和模式 2 是独立开发的,那么它们的类型通过派生相关的可能性很小,所以我猜您心里有第一种方法来解决这个问题。

不过,无论哪种形式,这个问题都是绝对可以解决的。对于任何模式(我仔细使用这个术语),根据定义,都声明了有限数量的类型和有限数量的元素名称;由此可见,元素名称/类型对的数量是有限的(可能很大)。

该算法可以是这样的。

  1. 从预期的根元素开始。 (如果有多个可能的根元素,那么在一般情况下,您需要对每个根元素运行此检查。)如果预期的根元素是 E,在模式 1 中类型为 T1,在模式 2 中类型为 T2,则将任务“比较类型 T1 和 T2”放入打开任务队列中。已完成的任务列表将为空。

  2. 比较两个复杂类型 T1 和 T2:

    • 检查为 T1 和 T2 声明的属性集,了解其名称之间的子集/超集关系。确保预期超集中所需的属性在预期子集中不存在或可选。

    • 为 T1 和 T2 声明的每个属性 A 将被分配一个类型(称为 ST1 和 ST2)。如果 ST1 = ST2,则不执行任何操作;否则,将任务“比较简单类型 ST1 和 ST2”添加到打开任务队列中,除非它位于已完成的比较列表中。

    • 现在检查 T1 和 T2 中可能的子序列——正如 13ren 在评论中建议的那样,这是很容易处理的,因为内容模型本质上是使用元素名称集作为字母表的正则表达式;因此,它们定义的语言是常规的,并且子集/超集关系对于常规语言是可确定的。

    • 每个可能的子元素 C 都由父类型 T1 和 T2 分配了元素声明和类型定义。我们将它们称为 ED1、ED2、CT1 和 CT2。每个同名的子元素都具有相同的类型,但不同的子元素可能匹配不同的元素声明。因此,对于任何可能的名称,只会有一对类型 CT1 和 CT2,但可能有多对 ED1 和 ED2(并且分析需要小心以确保它们正确匹配;这可能很难自动化)。

    • 如果 CT1 = CT2,则不执行任何操作,否则将“比较类型 CT1 和 CT2”放入打开的任务队列中,除非已执行比较。

    • 如果 ED1 和 ED2 结构相同,则不执行任何操作;否则将比较它们的任务放入任务队列中(除非它已经完成)。

  3. 要比较两个简单类型 ST1 和 ST2,请比较它们的词法空间(如果您想要模式上子集/超集关系的第一个定义)或它们的值空间(如果您想要第二个)。如果 ST1 和 ST2 都是同一基元类型的限制,您也许可以轻松比较它们的有效的基于分面的限制集。模式方面可能会使事情变得复杂,但因为它定义了一组正则表达式,所以子集/超集关系对于它来说是可判定的。

  4. 要比较两个元素声明,您需要比较元素声明的每个属性并检查所需的子集/超集关系。

正如您所看到的,它足够复杂和乏味,以至于您确实希望自动执行此分析,而且它也足够复杂,以至于很容易看出为什么它没有作为开箱即用功能广泛提供。但编码肯定会很有趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证一个 XSD 架构是另一个 XSD 架构的子集? 的相关文章

随机推荐

  • 如何在 Flask-Login 中实现 user_loader 回调

    我正在尝试使用 Flask 和Flask 登录 http packages python org Flask Login在 Flask 应用程序中实现用户身份验证的扩展 目标是从数据库中提取用户帐户信息 然后登录用户 但我遇到了困难 但是
  • jquery contenteditable 换行符

    我有一个内容可编辑区域 我正在尝试禁用输入 返回和移动输入来创建新段落 我使用下面的脚本进行此操作 但它同时禁用了所有按钮 我想做的是返回放置一个换行符 而不是转到一个新段落 content keypress function e retu
  • 如何编写行为类似于内置断言的自定义 PHPUnit 断言?

    我如何编写自定义断言 例如assertFoo expected actual 其行为类似于关于错误 堆栈跟踪 的内置断言 我目前定义了以下方法 在扩展的类中 PHPUnit Framework TestCase public static
  • SQL Server 存储过程中的返回值

    我有一个存储过程 其中有一个 if 语句 如果计数的行数大于0 则应设置唯一的输出参数 UserId to 0 但是它只返回查询第二部分的值 EmailAddress varchar 200 NickName varchar 100 Pas
  • 重新加载表单时如何保留文本框中的值

    我有一个非常简单的 vba 宏应用程序 由 2 个文本框和命令按钮组成 这个想法是用户需要在文本框中输入数值 然后单击按钮将其禁用 这样他们就无法更改该值 当表单重新加载时 数值会丢失 我必须重新输入另一个值 我想要的是当表单重新加载时 数
  • Sequelize 如何查找具有多个 where 子句和时间戳的行 > NOW()

    我该如何使用 Sequelize 来做到这一点 SELECT FROM sessions WHERE user id AND token AND expires gt NOW 这就是我想要做的 假设Session是一个 Sequelize
  • 将值添加到列表

    下面是我的代码 List
  • Twitter Bootstrap - row-fluid 的位置问题

    我目前正在使用 Twitter bootstrap 构建一个网站 这太棒了 我的布局使用 div class row div class span6 div div class span6 div div class span6 div d
  • 为什么调用 BitBlt 或 CopyRect 时会失去透明度?

    Problem 我正在尝试从 32x32 块复制TBitmap into a TPaintbox这是我的地图编辑器 但我似乎无法使透明度正常工作 见下图 注意 出于演示和测试的目的 我在 TPaintbox 下方放置了一个 TImage 这
  • Java 中什么时候必须有默认构造函数和参数化构造函数?

    很多时候我遇到一个异常 说 默认构造函数的实现丢失 很多时候 参数化构造函数的定义本身就可以完成所有工作 我想知道在什么条件下会发生这种情况 如果类中不存在构造函数 则在编译时添加一个默认构造函数 如果类中存在任何一个参数化构造函数 则在编
  • WordPress 迁移中主页未加载,所有其他页面均加载

    似乎还没有人遇到过这个问题 我刚刚将一个小型 WordPress 网站从 iPage 上的测试服务器空间迁移到 HostGator 上的客户端服务器 当我在新服务器上登录 WordPress 时 该网站显示正常 但如果我清除缓存并继续运行一
  • 无法调试 Android 应用程序

    我尝试在模拟器和设备上调试 Android 应用程序 但我总是收到消息 等待调试器 等待调试器附加到进程 我真的不知道如何设置环境和应用程序来运行调试 如果你们中的任何人能够提供任何有用的提示 我将非常感激 问题出在主机配置文件中 C Wi
  • 插入事务和参数?

    我正在学习 VB Net 需要使用开源 System Data SQLite ADO Net 解决方案来处理 SQLite 数据库 我在 HOWTO 部分找到的示例仅是 C 语言的 有人可以在 VB Net 中提供一个简单的示例吗 我可以研
  • 塔楼高度之间的最小差异?

    我正在做一些面试问题 我看到了这个 已知 n 座塔的高度和 k 值 您必须将每个塔的高度增加或减少 k 您需要最小化最长和最短塔的高度之间的差异并输出该差异 我想答案将是 maxheight k minheight k 我已经尝试过一些测试
  • 如何禁用 Android Oreo 中用于 espresso 测试的新自动填充功能

    在 Android 设备上运行测试sdk 26导致他们因为新的失败Autofill https developer android com guide topics text autofill html当 espresso 尝试单击字段时隐
  • 如何在rails中使用动态绑定执行原始更新sql

    我想执行一个更新原始 SQL 如下所示 update table set f1 where f2 and f3 这条 SQL 将被执行ActiveRecord Base connection execute 但我不知道如何将动态参数值传递到
  • 捕获测试用例顺序

    我可以保证多个的执行顺序吗TEST CASEs with Catch https github com philsquared Catch 我正在使用 LLVM 测试一些代码 它们有一些我需要显式初始化的卑鄙的全局状态 现在我有一个这样的测
  • RODBC 错误 - ODBC 连接失败 - 无法使用我的 Mac 连接到 MySQL(小牛)

    我正在尝试在我的 mac 小牛 上使用 RODBC 通过 R 连接到 mysql 数据库 但经过几个小时的愚蠢努力后 我仍然无法让它工作 当我尝试连接到数据库时 RODBC 抛出此错误 错误消息非常简洁 我不知道这意味着什么 ch 我按照以
  • AWS RDS 公共访问

    我对 AWS 配置感到困惑 我的目标是创建一个可从网络内部和外部访问的数据库 这是我所拥有的 RDS 实例运行 postgresql VPC 内部的连接正常工作 端点被设置为可公开访问 当从外部访问时 实际上确实可以解析 但是 连接挂起 表
  • 如何验证一个 XSD 架构是另一个 XSD 架构的子集?

    如何验证一个 XSD 架构是否是另一个 XSD 架构的子集 我们正在使用 蓝图 XSD 模式的集合 定义子组件可用的所有可能的输入或输出 创建一个系统应用程序 许多子组件正在被实现 并且这些子组件使用 XML 文件在它们之间传递数据 每个子