是否有可能以更简单的方式重写此XSD?

时间:2012-02-05 10:41:07

标签: xml xsd

我有这个XSD来验证对我的api的传入请求:

<?xml version="1.0"?>
<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
    <xs:element name="request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="amenity">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="description" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

但它似乎有点混乱。嵌套元素太多等。是否可以用更简单,更少混淆的方式重写它?

2 个答案:

答案 0 :(得分:1)

如果您不希望它如此深层嵌套,您可以将复杂类型更改为命名类型,然后通过元素声明中的名称引用它们。这样做的好处在于可以重复使用这些类型。但它不会使这个简单的架构变得更简单......

答案 1 :(得分:0)

是的还有另一种方式..

将每个实体定义为ComplexType为其命名,并用作TYPE:)

这是你的样本xml和xsd
XML:

<request>
  <amenity>
    <description>text</description>
  </amenity>
</request>

<强> XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="request" type="request"/>

  <xs:complexType name="request">
    <xs:sequence>
      <xs:element name="amenity" type="amenity"/>
    </xs:sequence>
  </xs:complexType>  

    <xs:complexType name="amenity">
      <xs:sequence>
              <xs:element name="description" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
</xs:schema>


更多解释:
假设你的xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<request>
  <amenity>
    <description>text</description>
    <foo>text</foo>
  </amenity>
  <foobar>
    <amenity2>
      <description>text2</description>
      <foo>text3</foo>
    </amenity2>
  </foobar>
</request>

你的XSD会非常简单..因为你不必两次定义<descirption/><foo/>标签:)
观察我多次使用Type="General":)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="request" type="request"/>

  <xs:complexType name="request">
    <xs:sequence>
      <xs:element name="amenity" type="General"/>
      <xs:element name="foobar" type="foobar"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="General">
    <xs:sequence>
      <xs:element name="description" type="xs:string" />
      <xs:element name="foo" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="foobar">
    <xs:sequence>
      <xs:element name="amenity2" type="General"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>