日期:2014-05-19  浏览次数:21100 次

★★★★★ 请教一个XSD强类型的问题 【【100】】 ★★★★★
我要对XML文件进行验证,所以我写下了如下代码,根据数据库表结构来推断出了一个相对强类型的XML。
程序如下:
                  DataSet   ds   =   ZTC.Engine.Testing.DataTableToXSDTest();
ds.WriteXml( "d:\\abc\\123.xml ");
ds.WriteXmlSchema( "d:\\abc\\123.xsd ");
形成的XSD文件如下:
...............................
<xs:element   name= "tgyszl ">
<xs:complexType>
          <xs:sequence>
<xs:element   name= "Gys_id "   type= "xs:int "   minOccurs= "0 "   />
<xs:element   name= "cEnterpriseCode "   type= "xs:string "   minOccurs= "0 "   />
<xs:element   name= "ID "   type= "xs:int "   minOccurs= "0 "   />
<xs:element   name= "Gys_syrq "   type= "xs:dateTime "   minOccurs= "0 "   />
<xs:element   name= "Gys_mc "   type= "xs:string "   minOccurs= "0 "   />
<xs:element   name= "Gys_xkzhm "   type= "xs:string "   minOccurs= "0 "   />
<xs:element   name= "Gys_xkzxq "   type= "xs:dateTime "   minOccurs= "0 "   />
<xs:element   name= "Gys_yyzzhm "   type= "xs:string "   minOccurs= "0 "   />
<xs:element   name= "Gys_yyzzxq "   type= "xs:dateTime "   minOccurs= "0 "   />
<xs:element   name= "Gys_qylbjy "   type= "xs:string "   minOccurs= "0 "   />
.......
</xs:sequence>
</xs:complexType>
</xs:element>
..................................................

形成的XSD文件,只有类型,没有长度限制。
有没有办法用程序直接生成更强类型的XSD定义啊?
比如:
<xs:element   name= "au_id "> <xs:simpleType> <xs:restriction   base= "xs:string "> <xs:minLength   value= "1 "   /> <xs:maxLength   value= "5 "   /> </xs:restriction>
                  </xs:simpleType>
</xs:element>
否则手动在配置的话,我几百个字段,配到下个星期一了。

------解决方案--------------------
ds.WriteXmlSchema( "d:\\abc\\123.xsd ");
==>
ds.Tables[0].WriteXmlSchema( "d:\\abc\\123.xsd ",true);

如果不行的话,建议访问数据库系统表,得到各列的限制条件,再XPATH查找节点,添加子节点或加在属性里。DataSet没有参数来设定保存你要求的强类型
------解决方案--------------------
关注,帮顶.........
------解决方案--------------------
讨论一下啊:使用xsd方便么?表面是方便了,但是做一些别的文章,例如楼主控制字节长度有出现问题了!
使用xsd是不是破坏了三层架构?我们知道使用xsd把添加修改删除还是实体都放在一起了
------解决方案--------------------
接个分 晚上看
------解决方案--------------------
你还是自己写代码把表结构生成xml文件算了,相关代码

检索表结构的SQL语句

string TableName= "Table1 ";
string Sql = "select A.Column_ID,case A.is_identity when 1 then case C.Name when 'bigint ' then 'IdentityLong ' else 'Identity ' end else C.Name end as ColumnType, "
+ " isnull((select top 1 [value] from sys.extended_properties where A.object_ID=Major_ID and A.Column_ID=Minor_ID), ' ') as Memo, "