本站首页    管理页面    写新日志    退出


«may 2026»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:2
评论数量:1
留言数量:0
访问次数:23230
建立时间:2004年12月6日




schema的初步使用
原创空间,  软件技术

wuyong 发表于 2004/12/16 11:21:06

这些天在做一个报表工具项目,其中使用了大量的XML定义,需要对定义进行解析和保存。虽然使用digester来解析XML,可是在XML文档结构发生变化的时候维护其工作量还是比较大的。一直就想使用shcema来解决这个问题。这些天化了些时间研究了一下。定义好自己的schema后就可以使用jaxb或xmlbean来自动生成XML的java对象,减少了工作量。 举一个使用schema的小例子: 有如下的XML文件: <query uuid="String" type="jdbc-sql" datasource="String"> <fields>  <field name="String" type="java.lang.String"/>  <field name="String" type="java.lang.String"/> </fields> <parameters>  <parameter name="String" type="java.lang.String"/>  <parameter name="String" type="java.lang.String"/> </parameters> <jdbc-sql>  <sqlstring>select * from demo_dept</sqlstring> </jdbc-sql></query> 在这个文件中期望根据query的type来决定在query下出现不同的子节点,使用dtd是无法解决这个问题的。使用schmea可以解决这个问题,但不够完全。   定义的schmea文件如下: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:complexType name="parameter">  <xs:attribute name="name" type="xs:string" use="required"/>  <xs:attribute name="type" type="classType" use="required"/> </xs:complexType> <xs:complexType name="field">  <xs:attribute name="name" type="xs:string" use="required"/>  <xs:attribute name="type" type="classType" use="required"/> </xs:complexType> <xs:complexType name="query">  <xs:sequence>   <xs:element name="fields" minOccurs="0">    <xs:complexType>     <xs:sequence>      <xs:element name="field" type="field" minOccurs="0" maxOccurs="unbounded"/>     </xs:sequence>    </xs:complexType>   </xs:element>   <xs:element name="parameters" minOccurs="0">    <xs:complexType>     <xs:sequence>      <xs:element name="parameter" type="parameter" minOccurs="0" maxOccurs="unbounded"/>     </xs:sequence>    </xs:complexType>   </xs:element>   <xs:element ref="config"/>  </xs:sequence>  <xs:attribute name="uuid" type="xs:string" use="required"/>  <xs:attribute name="datasource" type="xs:string" use="required"/>  <xs:attribute name="type" type="queryType" use="required"/> </xs:complexType> <xs:complexType name="queryConfig"/> <xs:complexType name="jdbcQueryConfig">  <xs:complexContent>   <xs:extension base="queryConfig">    <xs:sequence>     <xs:element name="sqlstring" type="xs:string"/>    </xs:sequence>   </xs:extension>  </xs:complexContent> </xs:complexType> <xs:simpleType name="classType">  <xs:restriction base="xs:string">   <xs:enumeration value="java.lang.String"/>   <xs:enumeration value="java.lang.Integer"/>   <xs:enumeration value="java.lang.Double"/>   <xs:enumeration value="java.util.Date"/>   <xs:enumeration value="java.sql.Time"/>   <xs:enumeration value="java.sql.Timestamp"/>  </xs:restriction> </xs:simpleType> <xs:simpleType name="queryType">  <xs:restriction base="xs:string">   <xs:enumeration value="jdbc-sql"/>  </xs:restriction> </xs:simpleType> <xs:element name="config" type="queryConfig" abstract="true"/> <xs:element name="jdbc-sql" type="jdbcQueryConfig" substitutionGroup="config"/> <xs:element name="query" type="query"/></xs:schema>   500)this.width=500'>   看了上面的文件大家应该比较清楚了。对于query下的不同的元素使用了一个抽象的元素来代替。并且使用了schema中的继承的概念。但是实际上query的type属性和query下的子节点的名称应该是一直的,这个问题没有办法来解决。有的人会说,不如把整个query定义一个抽象的元素,用不同的query来实现就可以了。但是由于xml的文件中的query节点名称不会因为不同的query而不一样,所以这个想法也行不同。 也许有其他的办法来解决这个问题,欢迎大家赐教。


阅读全文(1352) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.537 second(s), page refreshed 144824980 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号