【发布时间】:2009-04-24 06:47:01
【问题描述】:
我有一个类的字段类型为DataTable。
我想为这个类编写 XSD。我的问题是数据结构不固定。列是动态添加的。如何为这样的类编写 XSD?
一旦定义了 XSD,我想针对 XSD 验证序列化为 XML 的类。
【问题讨论】:
标签: .net xml serialization datatable xsd
我有一个类的字段类型为DataTable。
我想为这个类编写 XSD。我的问题是数据结构不固定。列是动态添加的。如何为这样的类编写 XSD?
一旦定义了 XSD,我想针对 XSD 验证序列化为 XML 的类。
【问题讨论】:
标签: .net xml serialization datatable xsd
如果您要针对 XSD 验证序列化的 xml,这意味着它必须符合某种结构,但它可以非常灵活。您需要学习如何创建 XSD 以及各种属性和参数。无论您想要什么结构都可以开始定义它,一旦您开始这个过程,它就不会那么困难了。在提出具体问题后,SO 社区会提供帮助。
XSD 基础教程http://www.w3schools.com/Schema/ 你可以在 Liquid xml studio 中创建 XSD。它的免费和基于 GUI 的 http://www.liquid-technologies.com/
【讨论】:
听起来您需要一种元格式,其中架构定义了一种定义列的方式,而不是定义特定的列本身。
这种 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>
【讨论】:
一般来说,如果列是动态的,那么 XSD 也必须是动态的。 一种解决方案可能是对创建表列的函数实现补充函数,该函数为适当的 xls 元素(表示类表)动态创建 xls 语句。当然,必须提前定义 xsd 的静态部分,并将其与动态创建的 xsd 部分合并。
使用 XML 我建议您使用 Stylus Studio。
【讨论】: