XML和XSLT实现代码生成器(I)

类别:Java 点击:0 评论:0 推荐:
XML和XSLT实现代码生成器(I) 摘要

       XML和XSLT为开发WEB应用提供了非常好的解决方案,然而,它们的能力不仅限制在WEB开发上,其实它们提供了很好的基于元数据(meta data)编程的模型,利用XML作为元数据并用XSLT就可以将它转换为任何想要的形式或其他数据。本文第一部分介绍了如何利用Java以及XML和XSLT实现代码生成器功能,,第二部分讨论了使用这种解决方案的优点和不足,以及如何改进该方案使用,本文同时还展示了JAXP和JDOM API的使用。

介绍

       编写代码是程序员的日常工作,通常编写程序代码被认为是有创造性的工作,这也是很多人热爱编程的一大理由。然而有时人们不得不面对重复编写一些简单的,另人乏味的代码,最好的例子就是Java中的JavaBean,尤其是在J2EE应用中,程序员需要在Web层编写许多JavaBean和数据层(通常是EJB)交换数据,为每一个JavaBean编写get, set方法是十分机械而枯燥的工作。如果这些类似的工作能由机器自动完成,程序员就可以花费更多的努力在有创造的开发上了。代码生成器就是为了这个目的而出现的,基本上所有流行的IDE都或多或少的包含代码生成的能力。例如,在VC中创建项目时IDE生成MFC的基本框架代码以及Jbuilder高版本中自动生成JavaDoc注释的功能。要实现一个代码生成器,首先必须提供有关于生成什么代码的基本信息,也即元数据,然后程序提取这些元数据并自动生成实际的代码。不难想象,提供元数据的最好方法就是使用一种统一的,容易验证的而且便于提取的数据格式,XML,DTD或XML Schema(可选)以及XSLT的组合正好提供了这一切。XML提供统一的数据,DTD或XML Schema用于验证数据的有效性,而XSLT则用于提取XML元数据并进行转换。后面的部分将以一个JavaBean代码生成器为例,详细介绍如何将这些技术组合起来用于实际应用。

建立简易模型

       JavaBean是包含一组属性的简单Java类,通常包括字段定义,构造函数以及几对get/set方法。可以首先为XML元数据建立一个DTD表示它应包含的基本信息。列表1.1展示了一个这样的DTD模型。<?xml version="1.0" encoding="UTF-8"?>

<!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by starchu1981 (melbourne university) -->

<!ELEMENT xgen (javabean?)>

<!ELEMENT javabean (name, package, implement*, property*)>

<!ELEMENT package (name, description?)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT description (#PCDATA)>

<!ELEMENT implement (#PCDATA)>

<!ELEMENT property (name, exception*)>

<!ELEMENT exception (#PCDATA)>

<!ATTLIST property

       type CDATA #REQUIRED

       set (yes | no) #IMPLIED

       get (yes | no) #IMPLIED>

列表1.1

javabean的implement子元素代表该Bean所实现的接口,当然也可定义一个extend子元素表明Bean所扩展的类,Property元素的属性列表还可以在以后加入isIndex属性用来表明该属性是否是一个index属性。由于DTD基本是自解释,所以就不一一详细说明了。DTD设计完成后就可以利用它来书写XML数据了。列表1.2是一个简单XML例子

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE xgen SYSTEM "../dtd/xgen-javabean.dtd">

<xgen>

    <javabean>

        <name>test2</name>

        <package>

            <name>com.xs.xgen.test</name>

            <description>Test For XGen Dtd and XML model</description>

        </package>

        <property type="java.lang.String" set="yes" get="yes">

            <name>description</name>

        </property>

        <property type="int" set="no" get="yes">

            <name>innerData</name>

            <exception>AccessNotAllowedException</exception>

        </property>

        <property type="javax.xml.transform.Source" set="yes" get="no">

            <name>source</name>

            <exception>SAXNotRecognizedException</exception>

            <exception>SAXNotSupportedException</exception>

        </property>

        <property type="int" set="no" get="no">

            <name>nonsenseData</name>

        </property>

    </javabean>

</xgen>

列表1.2

本文地址:http://com.8s8s.com/it/it16518.htm