| « | may 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 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而不一样,所以这个想法也行不同。
也许有其他的办法来解决这个问题,欢迎大家赐教。 |
|
|