为行集和语义标记重用XML元素

时间:2011-10-20 16:01:02

标签: xml xsd

我们需要提供一个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>    

1 个答案:

答案 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类型,它实际上可以代表许多不同的东西作为重复使用的良好候选者。

如果您希望我扩展这一点,我很乐意这样做。