【问题标题】:XML Schema - a list of stringXML Schema - 字符串列表
【发布时间】:2012-09-11 17:15:57
【问题描述】:

元素必须具有“字符串列表”类型,并且可以有0 或更多次出现该类型的信息。所以我所做的是:

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

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

我相信这是正确的,但是

minOccur 和 maxOccur 应该放在哪里?

【问题讨论】:

  • “字符串列表”是什么意思?您想要元素“xxx”出现 0 到 x 次吗?或者你想要一个“xxx”元素,它有一个可以解析的分隔字符串?或者你想要一个包含 0 到 x 个子元素的“xxx”元素(实际上是你的列表)
  • psubsee2003 如果你不介意,你能给我所有可能的解释的例子吗?

标签: xml list schema


【解决方案1】:

很遗憾,您的问题不清楚,因为它可能意味着多种情况。

一种可能的解释是,您希望元素“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>

您不能在根元素上指定 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>

在您的示例中,“列表”类型的使用确实意味着我认为您认为它的含义。 XSD 中的列表类型不定义元素序列,而是定义一个可以具有由空格分隔的值列表的单个元素。

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

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

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

<xxx>item1 item2 item3 item4 item5</xxx>

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" />

生成的 XML 会是这样的:

<?xml version="1.0" encoding="utf-8"?>
<xxx>
  <child></child>
  <child></child>
  <child></child>
</xxx>

最后一个选项还有其他变体,例如将minOccurs="0" maxOccurs="unbounded" 从&lt;xs:sequence&gt; 移动到“子”元素。在您的示例中,这根本不重要,因为这两个定义都会产生完全相同的 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>

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

<?xml version="1.0" encoding="utf-8"?>
<xxx>
  <child1></child1>
  <child2></child2>
  <child1></child1>
  <child2></child2>
  <child1></child1>
  <child2></child2>
</xxx>

在哪里

<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>

会产生这样的 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>

【讨论】:

  • 这个答案非常准确,准确地回答了我的问题。非常感谢您的详细解答。
【解决方案2】:

为了避免得到一个对象,它有一个字段,它有一个字符串列表,你可能想使用更简单的方法:

<xs:complexType>
    <xs:sequence>
        <xs:element name="stringList" block="extension"
            minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

然后在生成的类中你会得到一个字段,它直接包含列表(不是对象)

List<String> stringList;

【讨论】:

    【解决方案3】:

    这是我发现的一个代码示例,可能对您有所帮助:

    <xs:element name="person">
    <xs:complexType>
            <xs:sequence>
              <xs:element name="full_name" type="xs:string"/>
              <xs:element name="child_name" type="xs:string"
              maxOccurs="10" minOccurs="0"/>
            </xs:sequence>
    </xs:complexType>
    </xs:element>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多