简单类型定义 xml 模式
simpleType definitions xml schema
我有点不确定我看到的关于 simpleTypes 的不同示例 declared/defined。从我在两个站点上看到的语法描述相同,但示例不同。
在https://www.w3schools.com/xml/el_simpletype.asp中我看到:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
但在 https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256050(v%3Dvs.100) 他们使用:
<xs:simpleType name="freezeboilrangeInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
这两种方式有区别吗?如果是这样,有什么区别?如果它们相同,应该使用哪一个/是最佳实践?
第一个示例是一个 xsd 元素,它以嵌入式方式包含其类型定义。
第二个示例仅包含类型定义 (xs:simpleType),没有引用它的元素。但是没有元素或属性引用它的类型定义没有任何意义。
因此,为了使两个示例具有可比性(具有相同的结果),您需要在第二个示例中添加一个引用类型定义的元素:
<xs:element name="age" type="tns:freezeboilrangeInteger"/>
<xs:simpleType name="freezeboilrangeInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
从两个选项(嵌入式或外部类型定义)来看,后者更可取,因为它可重用。
//更新(由于评论)
我设置了一个 XSD here,其中包含这三种方法(嵌入类型定义、引用类型定义和引用元素),因为
我认为在线使用 xsd2xml 生成器是了解 XSD 的最佳方式。起点是我的序列:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="mytns" xmlns:tns="mytns">
<xs:element name="agetest">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:simpleType name="freezeboilrangeInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
<xs:element name="mysequence">
<xs:complexType>
<xs:sequence>
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="age2" type="tns:freezeboilrangeInteger" />
<xs:element name="age3" ref="tns:agetest" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
生成以下示例 XML 结果:
<?xml version="1.0" encoding="utf-8"?>
<mysequence xmlns="mytns">
<age>83</age>
<age2>86</age2>
<nsA:agetest xmlns:nsA="mytns">18</nsA:agetest>
</mysequence>
我有点不确定我看到的关于 simpleTypes 的不同示例 declared/defined。从我在两个站点上看到的语法描述相同,但示例不同。
在https://www.w3schools.com/xml/el_simpletype.asp中我看到:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
但在 https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256050(v%3Dvs.100) 他们使用:
<xs:simpleType name="freezeboilrangeInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
这两种方式有区别吗?如果是这样,有什么区别?如果它们相同,应该使用哪一个/是最佳实践?
第一个示例是一个 xsd 元素,它以嵌入式方式包含其类型定义。
第二个示例仅包含类型定义 (xs:simpleType),没有引用它的元素。但是没有元素或属性引用它的类型定义没有任何意义。
因此,为了使两个示例具有可比性(具有相同的结果),您需要在第二个示例中添加一个引用类型定义的元素:
<xs:element name="age" type="tns:freezeboilrangeInteger"/>
<xs:simpleType name="freezeboilrangeInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
从两个选项(嵌入式或外部类型定义)来看,后者更可取,因为它可重用。
//更新(由于评论)
我设置了一个 XSD here,其中包含这三种方法(嵌入类型定义、引用类型定义和引用元素),因为 我认为在线使用 xsd2xml 生成器是了解 XSD 的最佳方式。起点是我的序列:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="mytns" xmlns:tns="mytns">
<xs:element name="agetest">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:simpleType name="freezeboilrangeInteger">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
<xs:element name="mysequence">
<xs:complexType>
<xs:sequence>
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="age2" type="tns:freezeboilrangeInteger" />
<xs:element name="age3" ref="tns:agetest" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
生成以下示例 XML 结果:
<?xml version="1.0" encoding="utf-8"?>
<mysequence xmlns="mytns">
<age>83</age>
<age2>86</age2>
<nsA:agetest xmlns:nsA="mytns">18</nsA:agetest>
</mysequence>