包含DataTable的类的XML Schema

时间:2009-04-24 06:47:01

标签: .net xml serialization datatable xsd

我有一个类,其类型为DataTable

我想为这个课写XSD。我的问题是数据结构不固定。列是动态添加的。如何为这样的类写XSD?

一旦定义了XSD,我想根据XSD验证序列化为XML的类。

3 个答案:

答案 0 :(得分:1)

如果要对XSD验证序列化的xml,这意味着它必须符合某种结构,但它可以非常灵活。您需要了解如何创建XSD以及各种属性和参数。无论你想要什么结构开始定义它,一旦你开始这个过程就不那么困难了。在询问具体问题后,SO社区将提供帮助。

基本XSD教程http://www.w3schools.com/Schema/ 您可以使用xml studio来创建XSD。它是免费的,基于GUI的http://www.liquid-technologies.com/

答案 1 :(得分:1)

听起来你需要一种元格式,其中模式定义了一种定义列的方法,而不是自己定义特定的列。

这种xml往往是丑陋和冗长的(例如,考虑xmlrpc和soap)。这也意味着模式无法验证实际列,只能验证它们是否已正确定义。

XML看起来像这样:

<DataTable>
  <column name="..." value="..."/>
  <column name="..." value="..."/>
</DataTable>

XSD将是这样的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="DataTable">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="column">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="value" type="xs:string"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

当然,如果您需要结构化值(不仅仅是字符串),那么您需要更复杂的东西。如果您需要任意对象,则可以将它们表示为每个对象的映射,其值可以依次为映射等。元素模式定义需要是递归的,因此它可以包含其自身的另一个实例。这基本上就是xmlrpc和soap所做的。

编辑这不适合您的“列”,但一个例子是:

<object name="contact">
  <object name="home">
    <object name="tel">
       <string name="area" value="910"/>
       <string name="num" value="1234 5678"/>
    </object>
  </object>
  <object name="work">
    <object name="tel">
       <string name="area" value="701"/>
       <string name="num" value="8888 8888"/>
    </object>
    <object name="fax">
       <string name="area" value="701"/>
       <string name="num" value="9999 9999"/>
    </object>
  </object>
</object>

语法的基本思想:

V --> string | O      // a Value is a string or an Object
O --> (K V)*          // an Object is list of named values (Key-Value pairs)

已更改,因此根始终是对象,并命名为:

O ==> (string K | O)* K

XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="object">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">

        <xs:element name="string">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="value" type="xs:string"/>
          </xs:complexType>
        </xs:element>

        <xs:element ref="object"/>

      </xs:choice>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

答案 2 :(得分:0)

一般来说,如果列是动态的,XSD也必须是动态的。 一种解决方案可能是为创建表列的函数实现补充函数,该函数为适当的xls元素(表示类表)动态创建xls语句。当然,必须事先定义xsd的静态部分,并将其与动态创建的xsd部分合并。

Wor使用XML我建议您使用Stylus Studio。