创建“灵活”的 XML 模式

2023-11-24

我需要为 XML 文件创建一个非常灵活的架构。它必须满足以下要求:

  1. 验证我们需要存在的一些元素,并了解其确切结构
  2. 验证一些可选元素,我们知道其确切结构
  3. 允许任何其他元素
  4. 以任意顺序允许它们

快速示例:

XML

<person>
    <age></age>
    <lastname></lastname>
    <height></height>
</person>

我对 XSD 的尝试:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="firstname" minOccurs="0" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

现在我的 XSD 满足要求 1 和 3。但是,如果名字和姓氏都是可选的,那么它不是有效的架构,因此它不满足要求 2,并且顺序是固定的,这无法满足要求 4。

现在我需要的只是验证我的 XML。我愿意接受有关任何方式的建议,无论是在 .NET 3.5 中以编程方式,还是另一种类型的架构等。

谁能想到一个解决方案来满足所有 4 个要求?


如果名称元素是可选的,则无法满足您的要求 3,因为您的架构将违反唯一粒子归因规则(基本上,处理器不知道是否根据名字或任何名称来验证名字)。

就验证而言,您并不局限于单一模式。如果您可以在不同的命名空间中使用两个模式,您可以这样做:

架构一- 允许任何事情:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="document">
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

方案二- 为某些元素添加特定验证:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://other" xmlns="http://other">
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
</xs:schema>

然后确保实例文档的 xsi:include 引用这两个架构。

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

创建“灵活”的 XML 模式 的相关文章

随机推荐

  • 使用 Openxml 2.0 在 Excel 中获取单元格背景颜色

    我正在尝试获取 Excel 电子表格中单元格的背景颜色 我正在使用 Open XML 2 0 SDK 我可以打开 xlsx 文件并获取单元格值 我获取背景颜色的代码如下 public BackgroundColor GetCellBackC
  • 设置 Gradle 缓存目录?

    是否可以设置 Gradle 缓存目录 而无需设置 GRADLE USER HOME 环境变量 我希望 Gradle 缓存与我的代码存在于同一工作区中 但这似乎只有通过围绕 Gradle 的 bash 脚本才能实现 为了澄清起见 我正在讨论包
  • Svc 处理程序到 SMC 调用

    如何用C编写svc处理程序来调用SMC 监视模式 指令以切换到arm cortex a9的监视模式 即从管理模式到监视模式需要在 svc 处理程序中完成哪些操作 如何在 C 中编写相同的内容 详细的答案值得赞赏 示例可以在 Linux 源代
  • 在 Python 中初始化 2D 列表:如何对每一行进行深拷贝?

    假设我想初始化一个全为 0 的 2D Python 列表 我会这样做 test 0 0 10 10 然后我开始修改第一个列表中的值 test 0 0 1 0 但这会由于某种原因影响所有列表的第一项 print test 1 0 0 0 0
  • 检测文本溢出已起作用并添加包含全文的工具提示

    我有一个包含电子邮件地址的简单跨度 span email protected span 在我的 CSS 中 跨度设置为固定宽度并带有省略号溢出 email display inline block width 100px overflow
  • maven支持kapt吗?

    是否可以在基于 Maven 的项目中运行 kapt kotlin 注释处理 如果是 我如何将 kapt 集成到 Maven 构建系统中 自 Kotlin 1 1 2 起 现在支持 Gradle 和 Maven 来运行 KAPT 插件 这记录
  • 无法通过引用传递参数 2 - uuid PDO

    我正在尝试插入UUID 和我的INSERT query handle gt beginTransaction Define query query INSERT INTO users users uuid type id VALUES uu
  • if-else-if 阶梯的两个部分的条件语句均为 true

    如果你有这样的代码 if A gt X B gt Y Action1 else if A gt X B gt Y Action2 With A gt X and B gt Y 将两个部分if else if梯子被执行 我正在处理存在此问题的
  • 多彩多姿的占位符文本

    我需要创建一个具有彩色占位符文本的 HTML 文本输入元素 所有文本都应为灰色 但结束星号应为红色 如下所示 在我看来 这是一项看似简单的任务 但实际上要复杂得多 因为浏览器限制了我们设置本机输入元素样式的能力 我听说有人使用 CSS 来覆
  • 什么是应用程序之间的本机消息传递以及它如何工作?

    Chrome 开发者文档提到了一个叫做Native Messaging直接从 Chrome 扩展程序或应用程序与其他桌面应用程序进行通信 我如何判断桌面应用程序何时具有此类可用的本机消息传递以及它可以接受哪种类型的通信 有没有办法让应用程序
  • documentdb 模拟器 gatewayservice 在启动时崩溃

    我想了解 documentdb 并安装模拟器 看起来没有错误 但是 启动后我的服务崩溃了 网关服务启动 从标题来看 我猜测这是模拟器的一项重要服务 有趣的是 模拟器似乎继 续加载并尝试打开 https localhost 8081 expl
  • 如何将答案转换为小数点后两位

    这是我的代码 我想要的输出是txtA Text and txtB Text保留两位小数 Public Class Form1 Private Sub btncalc Click ByVal sender As System Object B
  • 为什么 EF 5.x 对表使用复数名称?

    我对 ORM 框架 例如 Hibernate 甚至 Entity Framework 3 0 有一些经验 默认情况下 这些框架使用表的单数名称 例如 类 User 将映射到表 User 但是 当我使用 Visual Studio 2012
  • 使具有不可选取字段的对象可选取的正确方法是什么?

    对我来说 我所做的就是检测不可选取的内容并将其放入字符串中 我想我也可以将其删除 但随后它会错误地告诉我该字段不存在 但我宁愿让它存在但成为字符串 但我想知道是否有一种不那么老套 更正式的方式来做到这一点 我当前使用的代码 def make
  • Windows 上的 /usr/lib/ 相当于什么?

    我正在创建一个依赖于 libxml2 的跨平台程序 我不想在应用程序的 Windows 端口上使用 POSIX 环境 例如 Cygwin 或 MSYS 我计划使用 Javascript Host for Windows 和 nmake 创建
  • Java 中的函数式数据结构

    Java标准库是否有功能更新的功能数据结构 例如不可变集 列表等 函数式java has 集合 列表以及更多有趣的抽象
  • 如何使用 Java 中的 ResultSet 获取行数?

    我正在尝试创建一个简单的方法 该方法接收 ResultSet 作为参数并返回一个包含 ResultSet 行数的 int 这是一种有效的方法吗 int size 0 try while rs next size catch Exceptio
  • 在 matplotlib 中向辅助 y 轴添加 y 轴标签

    我可以使用以下命令向左侧 y 轴添加标签plt ylabel 但如何将其添加到辅助 y 轴 table sql read frame query connection table 0 plot color colors 0 ylim 0 1
  • Android Studio 错误:无法翻译 setText 中的字符串文字

    这是我的第一个应用程序 我遇到了一些麻烦 当我运行该应用程序时 它崩溃了 我不知道如何修复此错误 public class MainActivity extends AppCompatActivity TextView outputBott
  • 创建“灵活”的 XML 模式

    我需要为 XML 文件创建一个非常灵活的架构 它必须满足以下要求 验证我们需要存在的一些元素 并了解其确切结构 验证一些可选元素 我们知道其确切结构 允许任何其他元素 以任意顺序允许它们 快速示例 XML