我有这个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>
但它似乎有点混乱。嵌套元素太多等。是否可以用更简单,更少混淆的方式重写它?
答案 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>