gpt4 book ai didi

xml - 如何为 XML 节点的无序列表创建具有出现约束的模式

转载 作者:数据小太阳 更新时间:2023-10-29 01:39:32 25 4
gpt4 key购买 nike

鉴于这样的 XML 布局,我正在尝试创建一个 XSD 架构来验证它。

<RootNode>
<ChildA />
<ChildC />
<ChildB />
<ChildB />
<ChildA />
</RootNode>

要求如下:

  • ChildA、ChildB 和 ChildC 可以以任何顺序出现。 ( <xs:sequence> 不合适)
  • ChildA 是必需的,但可能出现多次。
  • ChildB 是可选的,可以出现多次。
  • ChildC 是可选的,可能只出现一次

我通常用来创建无序列表的技术是使用 <xs:choice maxOccurs="unbounded">但是,对于列表中的每个可能节点,我无法创建 minOccurs="1"对 ChildA 和 maxOccurs="1" 的约束对 ChildC 的约束。 (选择的出现次数优先于此处元素的出现次数)。

<xs:element name="RootNode">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="ChildA" minOccurs="1"/>
<xs:element name="ChildB" />
<xs:element name="ChildC" maxOccurs="1"/>
</xs:choice>
</xs:complexType>
</xs:element>

最佳答案

更新:在 XSD 1.1m 中,一些对all 组的限制已经解除。查看答案 herehere .

这不是一个简单的,但似乎是可行的。这里的困难部分是模式定义必须是确定性的。我使用的方法是通过绘制问题的有限状态自动机来可视化问题,然后编写与该自动机对应的正则表达式。它根本不像听起来那么复杂。尽管如此,使用其他一些验证系统可能会提供更简单的答案。

我做了一些测试,但很容易漏掉一些特殊情况。如果您发现错误,请发表评论。

...这是代码:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

<!-- Schema for elements ChildA, ChildB and ChildC
The requirements are as follows:
* ChildA, ChildB and ChildC may occur in any order.
* ChildA is mandatory but may occur multiple times.
* ChildB is optional and may occur multiple times.
* ChildC is optional and may occur once only.
-->

<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ABC-container" type="ABC" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="ABC">
<xsd:sequence>
<xsd:element name="ChildB" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:choice>
<xsd:sequence maxOccurs="1">
<xsd:element name="ChildC" type="xsd:string"/>
<xsd:element name="ChildB" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="ChildA" type="xsd:string"/>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="ChildA" type="xsd:string" minOccurs="0"/>
<xsd:element name="ChildB" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:sequence>
<xsd:sequence maxOccurs="1">
<xsd:element name="ChildA" type="xsd:string" minOccurs="1"/>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="ChildA" type="xsd:string" minOccurs="0"/>
<xsd:element name="ChildB" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element name="ChildC" type="xsd:string"/>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="ChildA" type="xsd:string" minOccurs="0"/>
<xsd:element name="ChildB" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:sequence>
</xsd:sequence>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>

</xsd:schema>

关于xml - 如何为 XML 节点的无序列表创建具有出现约束的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3382944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com