确保子元素不能在没有父元素的情况下存在 使用 Xsd



我在尝试在 xsd 中获取此架构验证时遇到问题。

有效案例

<root>
   <groups>
      <group/>
   </groups>
</root>
Valid case
<root>
<groups/>
</root>

大小写无效

<root>
  <group/>
</root>

如何通过 xsd 确保特定的子元素只能存在于某个父元素下,而不是单独存在于 xml 中?

在此例如组不能单独存在,但当组是父组时可以存在...

有人回答说不要使组元素全局,即将其包含在组元素中......

但可以有一个案例,其中组不是父级的直接子级。例如 有效案例

<groups>
<class>
   <group>
</class>
</groups>

在这种情况下应该怎么做...由于类也需要指代组...

根据你的问题,在我看来,你更像是希望类和组可以互换。 为此,您希望使用递归架构元素,例如...

<xsd:element name="Groups">
    <xsd:complexType>
        <xsd:complexContent>
            <xsd:extension base="BranchType"/>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:element>
<xsd:complexType name="BranchType">
    <xsd:sequence>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="Class" type="BranchType" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="Group" minOccurs="0" maxOccurs="1"/>
        </xsd:choice>
    </xsd:sequence>
</xsd:complexType>

我们基本上定义了一个 BranchType,它可以包含 Group 元素或自身的任意组合(通过 Class 元素)。 然后,我们将顶级组定义为 BranchType 类型。 我使用选择序列,以便类和组元素可以按任何顺序、任意次数出现在任何嵌套级别。

如果不希望

元素单独显示,则必须在定义其父级的复杂类型中声明该元素。

下面是一个简单的"修复",由一个工具生成;在学习时,它可能被证明是快速启动XSD的好方法,至少可以得到正确的语法......

更新

:如果继续添加内容,则需要更新架构。如果元素不是全局的,则解决方案是相同的:其父元素中的定义。如果内容模型相同,则将其定义为全局类型,并在元素的定义中引用它(在本例中,它将代替 anyType)。

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="groups">
          <xs:complexType>
            <xs:sequence minOccurs="0">
              <xs:element name="group" type="xs:anyType" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="groups">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="class">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="group" type="xs:anyType" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

相关内容

最新更新