XML Schema - 字符串列表

Jan*_*Doe 12 xml schema list

元素必须具有"字符串列表"类型,并且可以存在0或更多地出现该类型的信息.所以我做的是:

<xs:element name="xxx" type="ooo" />

<xs:simpleType name="ooo">
   <xs:list itemType="xs:string" />
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

我相信这是正确的,但是

我在哪里放minOccur,并maxOccur在这里?

psu*_*003 29

不幸的是,你的问题不清楚,因为它可能意味着多种事情.

一种可能的解释是,您希望元素"xxx"出现在0到x倍之间.这是通过在根元素内定义序列来完成的.

<xs:simpleType name="ooo">
  <xs:restriction base="xs:string" />
</xs:simpleType>

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="xxx" type="ooo" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

您不能在根元素上指定minOccurs和maxOccurs,因为XML中只能有1个根元素.但是您可以将序列定义为根元素的子序列,这就是上面示例中所做的.

现在,如果你想让"xxx"成为你的根元素,你可以有效地做同样的事情.这是完全相同的,除了一个名为"root"的元素,你现在有一个名为"xxx"的元素,而子元素被称为其他类型为"ooo"的元素

<xs:simpleType name="ooo">
  <xs:restriction base="xs:string" />
</xs:simpleType>

<xs:element name="xxx">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="xxx-child" type="ooo" maxOccurs="unbounded" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

在您的示例中,"list"类型的使用确实意味着我认为您认为它意味着什么.XSD中的列表类型不定义元素序列,而是定义可以包含由空格分隔的值列表的单个元素.

<xs:simpleType name="ooo">
  <xs:list itemType="xs:string" />
</xs:simpleType>

<xs:element name="xxx" type="ooo" />
Run Code Online (Sandbox Code Playgroud)

此架构定义生成的XML如下所示:

<xxx>item1 item2 item3 item4 item5</xxx>
Run Code Online (Sandbox Code Playgroud)

XML实际上是一个由空格分隔的任意长度的字符串的无界列表.您可以为继承的列表定义类型xs:string以限制值的类型,但我不知道限制长度的方法.

最后,我认为你想要完成的是接近我上面提到的"xxx"和"xxx-child"之一,但只是重新格式化序列的定义.

<xs:complexType name="ooo">
  <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element name="child" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:element name="xxx" type="ooo" />
Run Code Online (Sandbox Code Playgroud)

结果XML会这样:

<?xml version="1.0" encoding="utf-8"?>
<xxx>
  <child></child>
  <child></child>
  <child></child>
</xxx>
Run Code Online (Sandbox Code Playgroud)

最后一个选项还有其他变体,例如将其minOccurs="0" maxOccurs="unbounded"<xs:sequence>"子"元素移动到"子"元素.在您的示例中,它根本不重要,因为两个定义都会产生完全相同的XML.但是如果你有2个子元素,那就意味着不同的东西:

<xs:complexType name="ooo">
  <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element name="child1" type="xs:string" />
    <xs:element name="child2" type="xs:string" />
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

会产生这样的XML(child2跟随child2的序列会重复x次):

<?xml version="1.0" encoding="utf-8"?>
<xxx>
  <child1></child1>
  <child2></child2>
  <child1></child1>
  <child2></child2>
  <child1></child1>
  <child2></child2>
</xxx>
Run Code Online (Sandbox Code Playgroud)

在哪里

<xs:complexType name="ooo">
  <xs:sequence>
    <xs:element name="child1" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
    <xs:element name="child2" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

会产生这样的XML(child1会重复x次,然后是child2重复y次):

<?xml version="1.0" encoding="utf-8"?>
<xxx>
  <child1></child1>
  <child1></child1>
  <child2></child2>
  <child2></child2>
  <child2></child2>
  <child2></child2>
  <child2></child2>
</xxx>
Run Code Online (Sandbox Code Playgroud)