【问题标题】:simpleType definitions xml schemasimpleType 定义 xml 架构
【发布时间】:2020-05-20 20:40:20
【问题描述】:

我有点不确定我看到的关于如何声明/定义 simpleTypes 的不同示例。从我在两个网站上看到的情况来看,语法描述是相同的,但示例不同。

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>

这两种方式有什么不同吗?如果是这样,有什么区别?如果它们相同,应该使用哪一个/是最佳做法?

【问题讨论】:

    标签: xml web-services xsd schema xmlschema


    【解决方案1】:

    第一个例子是一个 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 的最佳方式。起点是mysequence:

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

    【讨论】:

    • 感谢您的回答!实际上它完全按照我预期的方向发展,虽然你所说的对我来说是有道理的,只是为了完整起见:我理解正确吗,在第一个变体中我可以使用&lt;xs:element ref="tns:age"&gt; 来重用元素?如果在 complexType 中我使用&lt;xs:element name.. type.. /&gt; 版本与使用&lt;xs:element ref... /&gt;one 会有区别吗?如果您在回答中添加一些关于此的内容,我会很乐意接受并投票。谢谢!
    • 我用一个例子和一个建议(xsd2xml转换器)更新了答案。
    • 非常感谢您的解释。我必须补充一点,我没想到最后一行(nsA)会这样......
    • 嘿!我在您链接的同一页面(liquid-technologies.com/online-xsd-validator)上的 xsd 验证器中运行这些东西,有趣的是验证失败......
    • 是的,你是对的 :D 工具似乎不是 100% 准确的。但是为了了解 XSD 定义和它们的 XML 结果之间的关系,我链接的页面应该足够了
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2021-07-17
    相关资源
    最近更新 更多