如何在 XML 模式中使任一字段为必填字段

2024-04-13

我有一个如下所示的架构,我有一些关于该架构的问题

1.制作方法CourierNumber or WorkLocationCoordinate强制性的。我使用了如下所示的一种全局类型

EDIT正如 Abel 在修改后的模式中提到的那样,仍然没有运气,但它失败了。输入 xml 是

<?xml version="1.0" encoding="utf-8"?>
<NOCPlantMapRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <NOCTypeID>0</NOCTypeID>
  <WorkLocation>
    <ParcelNumber>4545</ParcelNumber>
    <Roads>
      <WorkLocationRoad>
        <RoadName>dubai road</RoadName>
      </WorkLocationRoad>
    </Roads>
    <WorkArea>
      <WorkArea>
        <Coordinates>
          <WorkLocationCoordinate>
            <CoordinateX>56</CoordinateX>
            <CoordinateY>23</CoordinateY>
          </WorkLocationCoordinate>
        </Coordinates>
        <Communities />
      </WorkArea>
    </WorkArea>
  </WorkLocation>
</NOCPlantMapRequest>

架构是

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    attributeFormDefault="unqualified"
    elementFormDefault="qualified">
  <xsd:element name="NOCPlantMapRequest">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="NOCReference" minOccurs="0" type="xsd:string" />
        <xsd:element name="NOCTypeID" minOccurs="0" type="xsd:unsignedByte" />
        <xsd:element name="NOCTypeName" minOccurs="0" type="xsd:string" />
        <xsd:element name="ApplicationName" minOccurs="0" type="xsd:string" />
        <xsd:element name="Applicationtype" minOccurs="0" type="xsd:string" />
        <xsd:element name="RelatedNOCRefNumber" minOccurs="0" type="xsd:string" />
        <xsd:element name="WorkLocation" minOccurs="1" maxOccurs="1"  type="LocationType">
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="LocationType">
    <xsd:choice>
      <xsd:sequence>
        <xsd:element name="ParcelNumber" type="ParcelNumberType" />
      </xsd:sequence>
      <xsd:sequence>
        <xsd:element name="WorkArea" type="WorkAreaType" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>
  <xsd:simpleType name="ParcelNumberType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
  <xsd:complexType name="WorkAreaType">
    <xsd:sequence>
      <xsd:element name="WorkArea" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Coordinates" minOccurs="1" type="CoordinatesType" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="CoordinatesType">
    <xsd:sequence>
      <xsd:element name="WorkLocationCoordinate" type="WorkLocationCoordinateType"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="WorkLocationCoordinateType">
    <xsd:sequence>
      <xsd:element name="CoordinateX" type="xsd:string" />
      <xsd:element name="CoordinateY" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

但我收到错误,如下所示 无效。

Error - Line 6, 12: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 12; cvc-complex-type.2.4.d: Invalid content was found starting with element 'Roads'. No child element is expected at this point.
Error - Line 19, 24: org.xml.sax.SAXParseException; lineNumber: 19; columnNumber: 24; cvc-complex-type.2.4.d: Invalid content was found starting with element 'Communities'. No child element is expected at this point.

我的主要要求是ParcelNumber or WorkLocationCoordinateType应该呈现,出了什么问题?


1.如何强制使用 CourierNumber 或 WorkLocationCooperative。我使用了如下所示的一种全局类型

在您给定的代码中,这两个定义并不紧密结合在一起(一个位于第二个子级别,另一个是深度嵌套的),因此我很难理解您的意思。

同一级别(相同 XPath)的两个元素不可能具有相同名称但类型不同。如果您尝试一下,您会得到(取决于您的 XSD 解析器):

E [Xerces] cos-element-consistent: Error for type 'LocationType'. 
Multiple elements with name 'WorkArea', with different types, appear in the model group.

如果您可以使用 XSD 1.1,那么您可以通过使用断言来解决这个问题 https://stackoverflow.com/a/26620822/111575。由于唯一的信息WorkArea是坐标,我假设你的意思是在两者之间切换CourierNumber处于第一位置,或WorkArea位于第二位置,但不是两者(实际上,它会有助于显示包含您想要的变体的实例文档)。

如果是这样,如何应用元素名称 CourierNumber 和 WorkLocationCooperative 中的类型,因为 'CourierNumber' 已包含类型 xsd:unsignedShort

这就是你真正的问题所在。由于您不使用命名类型(一切都是具有匿名复杂类型定义的一个大元素),因此您无法引用这些类型。一种解决方案是重复定义,但这可能会变得乏味并且有其局限性。

我在下面提供的解决方案只是将您的代码重构为“类型优先”方法。也就是说,您得到的不是一个大的(难以阅读的)元素定义,而是一小块命名类型定义。意见可能会有所不同,但我相信这更具可读性,而且绝对更灵活。 A关于这种方法的详细介绍以及它的缺点和特点可以在 XFront 上找到 http://www.xfront.com/ElementVersusType.html.

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified">

    <!-- belonging to SO question https://stackoverflow.com/questions/33183835/how-to-make-either-of-the-fields-mandatory-in-xml-schema -->

    <xsd:complexType name="CoordinatesType">
        <xsd:sequence>
            <xsd:element name="WorkLocationCoordinate" type="WorkLocationCoordinateType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:simpleType name="CourierNumberType">
        <xsd:restriction base="xsd:unsignedShort"/>
    </xsd:simpleType>

    <xsd:complexType name="WorkLocationCoordinateType">
        <xsd:sequence>
            <xsd:element name="CoordinateX" type="xsd:unsignedByte" />
            <xsd:element name="CoordinateY" type="xsd:unsignedByte" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="WorkAreaType">
        <xsd:sequence>
            <xsd:element name="WorkArea">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="Coordinates" type="CoordinatesType" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="LocationType">
        <xsd:choice>
            <xsd:sequence>
                <xsd:element name="CourierNumber" type="CourierNumberType" />
                <xsd:element name="Roads" />
            </xsd:sequence>
            <xsd:sequence>
                <xsd:element name="Roads" />
                <xsd:element name="WorkArea" type="WorkAreaType" />
            </xsd:sequence>
        </xsd:choice>
    </xsd:complexType>

    <xsd:element name="Request">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Location" type="LocationType" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

这验证了以下任一情况:

<Request>
    <Location>
        <CourierNumber>12</CourierNumber>
        <Roads></Roads>
    </Location>
</Request>

Or this:

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

如何在 XML 模式中使任一字段为必填字段 的相关文章

  • asp.net/jQuery:使用 jQuery 将数据发布到弹出窗口 [IE]

    我正在尝试在 asp net 应用程序中使用 jQuery 将数据发布到弹出窗口 如果弹出窗口打开 我会收到三个错误 第一个错误是 Errror the value of the property is null or undefined
  • Android - 可绘制形状样式的多种颜色和尺寸

    我试图为我的 TextView 设置圆形背景 因此我创建了如下形状样式 但我需要有多种颜色和多种尺寸 而 textSize 保持不变 所以我需要在样式中设置宽度 高度 以我的理解 图层列表 http developer android co
  • 无法使用 dataformatstring 格式化日期时间

    由于某种原因 我无法在网格视图中格式化日期文本
  • 如何在登录名控件中显示用户名

    我有一个母版页 其中包含基于母版页的所有后续页面上显示的登录视图内容 我有一个用户名控件也嵌套在登录视图中 用于在用户登录时显示用户名 母版页中登录视图的代码显示如下 div class loginView div
  • 路径访问被拒绝 VS 2017 无法复制文件

    最近 Visual Studio 遇到了最奇怪的问题 我正在运行 2017 年 我有一个与同事合作了一段时间的存储库 有一天我突然尝试构建 但遇到了一些错误 内容如下 访问路径 function json 被拒绝 然后 在多次尝试构建和清理
  • 如何在 ASP.NET 中获取负载均衡器后面的主机名?

    我有几台服务器和一个负载均衡器 我想显示当前正在为该页面提供服务的服务器名称 我在用HttpContext Current Request ServerVariables SERVER NAME and HttpContext Curren
  • 在 C# 中使用(IDisposable obj = new ...) 在流中写入代码块(例如 XML)

    我已经开始使用实现 IDisposable 的类通过 using 语句在流中写入块 这有助于保持正确的嵌套并避免丢失或错误放置开始 结束部件 基本上 构造函数写入块的开头 例如打开 XML 标签 Dispose 写入结束 例如关闭 XML
  • php simpleXMLElement 到数组:空值

    我有以下 XML
  • 如何使自定义错误页面在 ASP.NET MVC 4 中工作

    我想要显示 500 404 和 403 的自定义错误页面 这是我所做的 在 web config 中启用自定义错误 如下所示
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • Linq to XML - 更新/更改 XML 文档的节点

    我有 2 个问题 1 我已经开始使用 Linq to XML 我想知道是否可以通过 Linq 更改 XML 文档 我的意思是 有没有类似的东西 XDocument xmlDoc XDocument Load sample xml updat
  • Android 子菜单布局

    我读到 Android 中的子菜单不支持图标 我想知道这是否已经改变 或者是否有类似的方法来生成支持图标的 子菜单 Currently This is My Submenu 这是它的 XML 文件 menu menu
  • 当用户告诉浏览器“刷新”时,是否应该填写 HTTP_REFERER?

    我正在尝试使用引用标头检查作为深度防御 即多种安全技术之一 但请注意仅依赖于任何一种技术 有时 MSIE 似乎不包含刷新时的引荐来源网址 这是预期的行为吗 无论如何 我是否可以检测刷新 以便我知道缺少引荐来源网址是可以的 是的 我知道引荐来
  • 为什么静态方法不能用作 ASMX Web 服务中的 Web 服务操作?

    我只是想了解为什么我不能在 Web 服务中使用静态 Web 方法 为什么会受到限制 有人可以给我对此进行简洁的解释吗 答案是 因为你不能 它不是这样设计的 其设计是 将创建 Web 服务类的实例 然后调用实例方法 我只能猜测微软为什么这样设
  • 如何在 Web 表单中进行 Html.Encode

    我有一个 ASP NET Web 窗体应用程序 有一个带有文本框的页面 用户在其中输入搜索词用于查询数据库 我知道我需要防止 JavaScript 注入攻击 我该怎么做呢 在 MVC 中我会使用Html Encode Web 表单中似乎无法
  • 将 XSD 文件分发到多个 Maven Artifacts

    这是我想要实现的一个小例子 Maven Artifact A 是众多 Web 服务之一 并定义了 XSD 架构 请求和响应的定义 src main resources xsd 工件 A 依赖于工件 B 工件 B 是一个简单的 JAR 项目
  • 扩展 XSD 文件

    我有一个带有枚举类型的 XSD 文件 我想创建一个 扩展 XSD 文件 它添加一些额外的枚举 但其他方面的行为就像主 XSD 一样 例如 主 XSD 文件包含以下内容
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u

随机推荐

  • atol() 与 strtol()

    atol 与 strtol 有什么区别 根据他们的手册页 它们似乎具有相同的效果以及匹配的参数 long atol const char nptr long int strtol const char nptr char endptr in
  • GetAssemblyIdentity 版本始终为 1.0.0.0

    尽管文件版本和产品版本均在 DLL 中定义 并且当我在 Windows 7 中查看其属性时正确显示 但版本为 1 0 0 0 有什么建议吗
  • 更改输入状态会延迟一个字符(useState 挂钩)

    我正在尝试在我的社交网络中实现用户个人资料的即时搜索 它似乎有效 但在输入更改时设置状态 使用挂钩 会导致延迟一个字符 我研究了一下 发现状态延迟的问题可以通过在 setState 中使用回调函数来解决 但是 useState 不支持这一点
  • 获取特定应用程序的屏幕截图

    我知道我可以使用 Graphics CopyFromScreen 获取整个屏幕的屏幕截图 但是 如果我只想要特定应用程序的屏幕截图怎么办 PrintWindow win32 api 将捕获窗口位图 即使该窗口被其他窗口覆盖或位于屏幕外 Dl
  • 什么是“柯里化”?

    我在几篇文章和博客中看到了对柯里化函数的引用 但我找不到一个很好的解释 或者至少是一个有意义的解释 柯里化是指将一个接受多个参数的函数分解为一系列函数 每个函数只接受一个参数 这是一个 JavaScript 示例 function add
  • jquery遍历新创建的元素

    我正在尝试在表中添加新行 并将它们保存到数据库中 首先 我使用 append 在表中追加行 tablename append tr td newly added row td tr 附加功能运行良好 我的页面显示了正确的结果 但是 我无法选
  • 如何以编程方式实例化新的视图控制器

    我有一个带有两个 UIButtons 和 UIlabels 的 ViewController 为了制作类似的 ViewController 我想以编程方式实例化一个新的视图控制器 像这样 let vc storyboard instanti
  • Android - 如何确定坐标是否位于 Google 地图中的道路上

    我需要在我的应用程序中进行检查 以确定给定的坐标是否位于 Google 地图中的道路上 Google Maps API 中是否有任何功能可以帮助我实现这一点 提前致谢 据我所知 使用 Google Maps API 无法完成此操作 我认为你
  • 将 html 输入对齐在同一行

    有人可以给出一个简单的解决方案 如何将表单输入对齐在同一行上 例如 很多时候 当我构建表单时 我可以让它们彼此对齐 并且看起来不错 但是如果我将两个输入 如文本区域 文本 放在另一个文本或按钮旁边 我会得到垂直对齐差异 有没有办法解决这个问
  • 突出显示两个字符串之间的差异

    如果我有两个较长的字符串 VARCHAR2 是否有一种简单的方法或算法可以复制或移植到 PL SQL 来比较它们 插入标记 即 以便在网页中呈现时 差异将突出显示 例如 BEGIN DBMS OUTPUT put line markup d
  • 如何动态切换 jquery 中的元素?

    所以我想做的是制作一个动态的小脚本来选择县和城市 好吧 我在 mysql 数据库中拥有所有国家和城市 如果我选择一个县
  • 如何在 GitLab CI 中显示来自另一个存储库的测试

    因此 我的项目包含单元测试 当我在 GitLab 中配置 CI 系统后发出合并请求时 它们会很好地显示为绿色或红色圆圈 但现在我也有一些集成测试 它们驻留在单独的存储库中 你为什么问 因为我有多个微服务需要一起测试 并且每个微服务都有自己的
  • vim 定界伴侣

    使用 DelimitMate 它会自动生成右括号 当我在括号内输入完毕后 按什么键可以快速转到右括号的右侧 现在我必须手动按 ESC 然后按 a 这些自动关闭插件 就像 Eclipse 等 IDE 中的原始功能实现一样 的想法是 您只需ty
  • C#:最易读的字符串连接。最佳实践[重复]

    这个问题在这里已经有答案了 可能的重复 我应该如何连接字符串 https stackoverflow com questions 3102806 how should i concatenate strings 在日常任务中 当执行任务时
  • 最小化时窗口内容消失

    我有一个简单的类 当鼠标拖动时画一条线 或者当鼠标按下 释放 时画一个点 当我最小化应用程序然后恢复它时 窗口的内容消失 除了最后一个点 像素 我明白这个方法super paint g 每次窗口更改时都会重新绘制背景 但无论我是否使用它 结
  • WebApi HTTPPOST 端点未命中

    我有以下简单的 HTTPPOST 端点 AllowAnonymous HttpPost Route forgotPassword public IHttpActionResult ForgotPassword string userName
  • 如何暂停 main()

    我正在尝试编写我的程序 以便当用户单击 Drive To JButton 在我的主类 Dispatch 中 时 它会从另一个类 Cab 打开一个 JFrame GoToDistination 用户可以在其中输入所需的内容信息 单击 继续 后
  • 如何仅在 Scrollview/Recyclerview 的底部添加淡入淡出边缘?

    I am using requiresFadingEdge true for adding fading effect at the bottom but the problem is it also shows fading effect
  • 如何将字符串{}值替换为obj(键值)

    我最近开始在 NodeJs 上编程 我有不同的字符串和 Json 对象 eg var str My name is name and my age is age var obj name xyz age 24 var str I live
  • 如何在 XML 模式中使任一字段为必填字段

    我有一个如下所示的架构 我有一些关于该架构的问题 1 制作方法CourierNumber or WorkLocationCoordinate强制性的 我使用了如下所示的一种全局类型 EDIT正如 Abel 在修改后的模式中提到的那样 仍然没