我们需要提供一个web服务,它从数据库中提取行集(可能是来自子游标的嵌套行)。
下面哪些是更清洁的方法。我更喜欢语义方法,尽管使用泛型元素可能有优势。
选项1:
为列表中的每个元素重用“Row”元素。可能有助于自动化(遇到时将Row转换为列表)。 XSD怎么样?
<Data1 rows="2">
<Row num="1"><Data11>Data</Data11></Row>
<Row num="2"><Data11>Data</Data11></Row>
</Data1>
<Data2 rows="3">
<Row num="1"><Data21>Data</Data21></Row>
<Row num="2">
<Data3 rows="1">
<Row num="1">
<Data4>Data</Data4>
<Data5>Data</Data5>
</Row>
</Data3>
</Row>
</Data2>
不要重复使用元素。保持语义结构(忽略下面的概括,它们将被有意义的元素替换)
<Data1 rows="2">
<Data1Row num="1"><Data11>Data</Data11></Data1Row>
<Data1Row num="2"><Data12>Data</Data12></Data1Row>
</Data1>
<Data2 rows="3">
<Data2Row num="1"><Data21>Data</Data21></Data2Row>
<Data2Row num="2">
<Data3 rows="1">
<Data3Row num="1">
<Data4>Data</Data4>
<Data5>Data</Data5>
</Data3Row>
</Data3>
</Data2Row>
</Data2>
答案 0 :(得分:0)
我会质疑你的整体设计。无论您是否重复使用行类型,您的设计仍然非常严格,并且将来会使更改变得更加困难。
为什么 Data 类型也不可重复使用?
模式可能如下所示:
<xs:schema xmlns="http://MySchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="MyRoot">
<xs:complexType>
<xs:sequence>
<xs:element name="Data" type="Data" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Type definition: Data -->
<xs:complexType name="Data" mixed="true">
<xs:sequence>
<xs:element name="Row" type="Row" minOccurs="0" />
</xs:sequence>
<xs:attribute name="rows" type="xs:int" />
</xs:complexType>
<!-- Type definition: Row -->
<xs:complexType name="Row">
<xs:sequence>
<xs:element name="Data" type="Data" minOccurs="1" />
</xs:sequence>
<xs:attribute name="num" type="xs:int" />
</xs:complexType>
</xs:schema>
这将允许您建模更广泛的数据结构变体。
<强>更新强>
阅读下面的评论我会说相反。您应该将每个实体(人,城市等)建模为单独的XSD复杂类型。如果有任何与重用相关的东西,重复使用只会带来好处,而且我看不到具有通用的Row类型,它实际上可以代表许多不同的东西作为重复使用的良好候选者。
如果您希望我扩展这一点,我很乐意这样做。