<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>wuyong的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=wuyong</link>
<description>wuyong的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[JasperReport的核心技术(1)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wuyong&amp;id=5630</link>
<author>wuyong</author>
<pubDate>2005/5/10 10:31:32</pubDate>
<description><![CDATA[
<P>　前一阶段在做一个报表的产品，仔细的研究了JasperReport的源代码。从中得到了很多有用的想法。</P>
<P>&nbsp;&nbsp;&nbsp; 其中的表达式处理技术就比较独特和适用。在报表中用到的所有的表达式都是采用了复合JAVA语法规则的JAVA表达式。在处理这些表达式的计算时，是把这些表达式从报表中提取出来，动态生成一个JAVA类，然后编译它，并序列化到文件中。但计算表达式的时候就可以反序列化JAVAL类，根据参数让这些JAVA类来计算具体的值。</P>
<P>&nbsp;&nbsp;&nbsp; 这样做有很多的好处。第一，不需要自己重新写一套表达式的处理程序。第二，表达式是符合JAVA语法规则，可以做任何的事情。第三，编译成JAVA类后的计算效率很高。</P>
<P>&nbsp;&nbsp;&nbsp; 在这里只是简单的介绍了其中的思路，如果有感兴趣的可以一起交流。</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[schema的初步使用]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wuyong&amp;id=1000</link>
<author>wuyong</author>
<pubDate>2004/12/16 11:21:06</pubDate>
<description><![CDATA[
<P>这些天在做一个报表工具项目，其中使用了大量的XML定义，需要对定义进行解析和保存。虽然使用digester来解析XML，可是在XML文档结构发生变化的时候维护其工作量还是比较大的。一直就想使用shcema来解决这个问题。这些天化了些时间研究了一下。定义好自己的schema后就可以使用jaxb或xmlbean来自动生成XML的java对象，减少了工作量。</P>
<P>举一个使用schema的小例子：</P>
<P>有如下的XML文件：</P>
<P>&lt;query uuid="String" type="jdbc-sql" datasource="String"&gt;<BR>&nbsp;&lt;fields&gt;<BR>&nbsp;&nbsp;&lt;field name="String" type="java.lang.String"/&gt;<BR>&nbsp;&nbsp;&lt;field name="String" type="java.lang.String"/&gt;<BR>&nbsp;&lt;/fields&gt;<BR>&nbsp;&lt;parameters&gt;<BR>&nbsp;&nbsp;&lt;parameter name="String" type="java.lang.String"/&gt;<BR>&nbsp;&nbsp;&lt;parameter name="String" type="java.lang.String"/&gt;<BR>&nbsp;&lt;/parameters&gt;<BR>&nbsp;&lt;jdbc-sql&gt;<BR>&nbsp;&nbsp;&lt;sqlstring&gt;select * from demo_dept&lt;/sqlstring&gt;<BR>&nbsp;&lt;/jdbc-sql&gt;<BR>&lt;/query&gt;</P>
<P>在这个文件中期望根据query的type来决定在query下出现不同的子节点，使用dtd是无法解决这个问题的。使用schmea可以解决这个问题，但不够完全。</P>
<P>&nbsp;</P>
<P>定义的schmea文件如下：</P>
<P>&lt;xs:schema xmlns:xs="<A href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</A>" elementFormDefault="qualified" attributeFormDefault="unqualified"&gt;<BR>&nbsp;&lt;xs:complexType name="parameter"&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="name" type="xs:string" use="required"/&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="type" type="classType" use="required"/&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&lt;xs:complexType name="field"&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="name" type="xs:string" use="required"/&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="type" type="classType" use="required"/&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&lt;xs:complexType name="query"&gt;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element name="fields" minOccurs="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="field" type="field" minOccurs="0" maxOccurs="unbounded"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/xs:element&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element name="parameters" minOccurs="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="parameter" type="parameter" minOccurs="0" maxOccurs="unbounded"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/xs:element&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="config"/&gt;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="uuid" type="xs:string" use="required"/&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="datasource" type="xs:string" use="required"/&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="type" type="queryType" use="required"/&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&lt;xs:complexType name="queryConfig"/&gt;<BR>&nbsp;&lt;xs:complexType name="jdbcQueryConfig"&gt;<BR>&nbsp;&nbsp;&lt;xs:complexContent&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:extension base="queryConfig"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="sqlstring" type="xs:string"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/xs:extension&gt;<BR>&nbsp;&nbsp;&lt;/xs:complexContent&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&lt;xs:simpleType name="classType"&gt;<BR>&nbsp;&nbsp;&lt;xs:restriction base="xs:string"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="java.lang.String"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="java.lang.Integer"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="java.lang.Double"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="java.util.Date"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="java.sql.Time"/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="java.sql.Timestamp"/&gt;<BR>&nbsp;&nbsp;&lt;/xs:restriction&gt;<BR>&nbsp;&lt;/xs:simpleType&gt;<BR>&nbsp;&lt;xs:simpleType name="queryType"&gt;<BR>&nbsp;&nbsp;&lt;xs:restriction base="xs:string"&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:enumeration value="jdbc-sql"/&gt;<BR>&nbsp;&nbsp;&lt;/xs:restriction&gt;<BR>&nbsp;&lt;/xs:simpleType&gt;<BR>&nbsp;&lt;xs:element name="config" type="queryConfig" abstract="true"/&gt;<BR>&nbsp;&lt;xs:element name="jdbc-sql" type="jdbcQueryConfig" substitutionGroup="config"/&gt;<BR>&nbsp;&lt;xs:element name="query" type="query"/&gt;<BR>&lt;/xs:schema&gt;<BR></P>
<P>&nbsp;</P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://w3china.org/blog/uploadfile/20041216114535154.BMP" border=0></P>
<P>&nbsp;</P>
<P>看了上面的文件大家应该比较清楚了。对于query下的不同的元素使用了一个抽象的元素来代替。并且使用了schema中的继承的概念。但是实际上query的type属性和query下的子节点的名称应该是一直的，这个问题没有办法来解决。有的人会说，不如把整个query定义一个抽象的元素，用不同的query来实现就可以了。但是由于xml的文件中的query节点名称不会因为不同的query而不一样，所以这个想法也行不同。</P>
<P>也许有其他的办法来解决这个问题，欢迎大家赐教。</P>]]></description>
</item>
</channel>
</rss>