Xml 元素的内联子元素(如果该类型只有一个元素)

Xml 元素的内联子元素(如果该类型只有一个元素),xml,xsd,xmlschema,Xml,Xsd,Xmlschema,假设我想做一个模型。一种产品可以有不同的款式,例如有不同颜色的T恤,也可以有单一的款式,例如只有一种颜色的毛衣 我想创建一个模式,允许这两种语法都有效: <MyXMLDoc> <Product> <Variants> <Variant> <Name>Red T-Shirt</Name> <Description>A red t-shirt</Description&

假设我想做一个模型。一种产品可以有不同的款式,例如有不同颜色的T恤,也可以有单一的款式,例如只有一种颜色的毛衣

我想创建一个模式,允许这两种语法都有效:

<MyXMLDoc>

<Product>
  <Variants>  
    <Variant>
      <Name>Red T-Shirt</Name>
      <Description>A red t-shirt</Description>
    </Variant>

    <Variant>
      <Name>Green T-Shirt</Name>
      <Description>A green t-shirt</Description>
    </Variant>

    <Variant>
      <Name>Blue T-Shirt</Name>
      <Description>A blue t-shirt</Description>
    </Variant>

  </Variants>
</Product>

<Product>
  <Name>Black sweater</Name>
  <Description>A plain ol' black sweater</Description>
</Product>

</MyXMLDoc>
我能得到的最接近的结果是:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="MyXMLDoc">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="Product"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Product">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="Variant"/>
                <xs:element ref="Variants"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="Variants">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="Variant"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Variant">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Name"/>
                <xs:element ref="Description"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Name" type="xs:string"/>
    <xs:element name="Description" type="xs:string"/>
</xs:schema>
xs:or之间的选择允许我去掉嵌套级别,但是and仍然需要在单个下作为父对象

有没有一种方法可以告诉XML模式从中期望元素或元素的内嵌成员,而不需要实际包装在中?
请注意和`

我认为这就是您的目标:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="MyXMLDoc">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="Product"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Product">
        <xs:complexType>
            <xs:choice>
                <xs:group ref="VariantGroup"/>
                <xs:element ref="Variant"  maxOccurs="unbounded"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="Variant">
        <xs:complexType>
            <xs:group ref="variantGroup"/> 
        </xs:complexType>
    </xs:element>

    <xs:group name="VariantGroup">
        <xs:sequence>
            <xs:element name="Name" type="xs:string"/>
            <xs:element name="Description" type="xs:string"/>
        </xs:sequence>
    </xs:group>

</xs:schema>
我删除了该级别,因为您的注释似乎表明您希望避免它——尽管您的XML示例确实包含它

虽然您建议的XML可以使用XML模式进行描述,但我认为这样表示单变量产品会更简单:

<Product>
  <Variant>
    <Name>Black sweater</Name>
    <Description>A plain ol' black sweater</Description>
  </Variant>
</Product>

这将使XML模式更加简单-只需在Variant元素上设置minOccurs=1。

Ah,xs:group正是我想要的,谢谢!你是对的,模式稍微复杂一点,但在我的用例中,有效负载大小的减少和简单性是值得的。嘿,Kim,你知道在xs:group中使用xs:choice作为几种复杂类型的命名联合的一种方式是否是传统的吗?例如,我创建了一个命名组,我将其称为一个或多个图像,可以对两者进行建模,这并没有错,但我不愿意将其称为“常规”,因为几乎每个人都使用可变长度数组来处理您的用例。我知道您正在尝试最小化文档大小,但如果这是一个主要问题,那么XML是一个奇怪的选择!我追求简洁的目的更多的是简化简单的案例——一个图像、一个变体等等,并允许逐步披露复杂性。我们有很多可以调整和复杂的东西,但要求相对简单。我们想使两者都成为可能。您能链接到一些关于XML中可变长度数组的参考吗?我知道C语言中的VLA之类的东西,但我不能用这个名字来表示任何与XML相关的东西