元素必须具有“字符串列表”类型,并且可以0
或更多地出现该类型的信息。所以我做的是:
<xs:element name="xxx" type="ooo" />
<xs:simpleType name="ooo">
<xs:list itemType="xs:string" />
</xs:simpleType>
我认为这是正确的,但
我在哪里放minOccur
和maxOccur
?
答案 0 :(得分:26)
遗憾的是,你的问题不清楚,因为它可能意味着多件事。
一种可能的解释是,您希望元素“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>
在您的示例中,“list”类型的使用确实意味着您认为它意味着什么。 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"
从<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>
会产生这样的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>
其中
<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>
答案 1 :(得分:0)
为避免获得具有字段和字符串列表的对象,您可能希望使用更简单的方法:
<xs:complexType>
<xs:sequence>
<xs:element name="stringList" block="extension"
minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
</xs:sequence>
</xs:complexType>
然后在生成的类中,您将获得一个字段,该字段直接包含列表(不是对象)
List<String> stringList;
答案 2 :(得分:-1)
以下是我发现的可能对您有帮助的代码示例:
<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>