【问题标题】:XML Schema for class containing a DataTable包含 DataTable 的类的 XML 架构
【发布时间】:2009-04-24 06:47:01
【问题描述】:

我有一个类的字段类型为DataTable

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

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

【问题讨论】:

    标签: .net xml serialization datatable xsd


    【解决方案1】:

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

    XSD 基础教程http://www.w3schools.com/Schema/ 你可以在 Liquid xml studio 中创建 XSD。它的免费和基于 GUI 的 http://www.liquid-technologies.com/

    【讨论】:

      【解决方案2】:

      听起来您需要一种元格式,其中架构定义了一种定义列的方式,而不是定义特定的列本身。

      这种 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>
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-03
          • 2010-09-24
          • 2014-09-28
          • 2014-10-04
          • 1970-01-01
          • 2018-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多