我有一个类,其类型为DataTable
。
我想为这个课写XSD。我的问题是数据结构不固定。列是动态添加的。如何为这样的类写XSD?
一旦定义了XSD,我想根据XSD验证序列化为XML的类。
答案 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。