分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

生成JDOM文档

当我们定义好数据模型后,下一步就是将数据模型转换为JDOM文档结构。这里可以有不同的设计方式:可以为每个Java类定义对应的工具类用于生成JDOM的Element;也可以在每个Java类中添加一个方法用于转换;还可以创建JDOM的Element类的定制子类,在子类中,构造函数可以将数据对象作为参数传入。不论使用哪种方法,一致性是最重要的目标[1]。实现非常简单,只要根据DTD定义的对象结构,很容易生成JDOM的Element对象。

package com.xs.xgen.javabean;

import java.util.*;

import org.jdom.*;

public class JavaBeanJDOM {

private JavaBeanJDOM(){}

public static Element produceElement(JavaBeanData javabean){

Element javabeanElement=new Element("javabean");

javabeanElement.addContent(new Element("name").setText(javabean.getName()));

javabeanElement.addContent(

PackageJDOM.produceElement(javabean.getPackageData()));

Iterator implementIt=javabean.getImplement().iterator();

while(implementIt.hasNext()){

javabeanElement.addContent(new Element("implement").setText((String)implementIt.next()));

}

Iterator propertyIt = javabean.getPropertyData().iterator();

while(propertyIt.hasNext()){

javabeanElement.addContent(

PropertyJDOM.produceElement((PropertyData)propertyIt.next()));

}

return javabeanElement;

}

list 2.7 JavaBeanJDOM.java

public class PropertyJDOM {

private PropertyJDOM() {}

public static Element produceElement(PropertyData propertyData){

Element propertyElement = new Element("property");

addPropertyAttributes(propertyElement,propertyData);

propertyElement.addContent(

new Element("name").setText(propertyData.getName()));

Iterator exceptionIt = propertyData.getExceptions().iterator();

while(exceptionIt.hasNext()){

propertyElement.addContent(

new Element("exception").setText((String)exceptionIt.next()));

}

return propertyElement;

}

private static void addPropertyAttributes(Element property,PropertyData data){

property.addAttribute("type",(String)data.getAttributes().get("type"));

property.addAttribute("access",(String)data.getAttributes().get("access"));

property.addAttribute("set",(String)data.getAttributes().get("set"));

property.addAttribute("get",(String)data.getAttributes().get("get"));

}

}

list 2.8 PropertyJDOM.java

public class PackageJDOM {

private PackageJDOM() {}

public static Element produceElement(PackageData packageData){

Element packageElement = new Element("package");

packageElement.addContent(new Element("name").setText(packageData.getName()));

if(!("".equals(packageData.getDescription()))){

packageElement.addContent(

new Element("description").setText(packageData.getDescription()));

}

return packageElement;

}

}

list 2.9 PackageJDOM.java

转换JDOM到输出

当动态生成XML文档为JDOM结构后,唯一要做的就是将其作为数据源输入到JAXP的Transformer类实现实际的代码转换工作。因为当前的JAXP版本并不直接支持JDOM的Element,所以需要首先将JDOM转换为标准的DOM,使用JDOM的DOMOutputter类完成这项任务。

Element root=new Element(“xgen”);

root.addContent(JavaBeanJDOM.produceElement(javabeanData));

org.jdom.Document doc=

new org.jdom.Document(root);

org.jdom.output.DOMOutputter domOut=new org.jdom.output.DOMOutputter();

org.w3c.dom.Node domNode = domOut.output(doc);

接下来可以使用JAXP的Transformer类完成转换了。

Transformer transformer=

TransformerFactory.newInstance().newTransformer(new StreamSource(xslFile));

transformer.transform(new DOMSource(domNode),new StreamResult(javaFile));

图形化代码生成器

由于所有的数据接口设计已经完成,现在只需要使用一些图形设计工具如NetBean或Jbuilder就可以完成图形化的要求,这一步相对简单,图形接口的方法只需要生成对应的数据对象,并利用JDOM生成工具类生成动态XML文件,然后调用JAXP的API就可以完成代码生成的功能。在此就不做介绍了,有兴趣的读者可以自行设计自己的用户界面。但是要注意XSLT文件的读取,因为它是静态的并存储为文件形式,所以要提供XSLT文件的绝对路径。可以使用Jar将类文件以及XSLT文件打包到一个Jar文件,并使用ClassLoader.getSystemResource(String relativePath) 方法获得XSLT文件的绝对路径。

总结

本文第一部分介绍了如何使用XML和XSLT实现简单的代码生成功能,第二部分讨论了如何优化生成结果并为图形化需求提供动态XML数据生成功能。本文的目的并不是针对JavaBean代码生成(因为一个只是自动生成JavaBean代码的系统是没有多少吸引力,有很多系统都提供这一功能),而是利用XML&XSLT的组合提供一种针对代码生成问题的轻量级解决方案。读者可以考虑JAXB提供的利用XML Schema自动生成Java对象的功能,使用本文的解决方案可以实现完全同样的功能。类似的问题诸如自动生成Java RMI对象,自动生成EJB类,自动生成Web或EJB配制文件,为开发中的类自动生成单元测试代码以及为Web Service数据生成XML Schema以及SOAP消息等等,本文的方案都能够发挥作用,而且容易开发,只要提供元数据,就可以通过XSLT将元数据转换为各种想要的格式。

References

[1] Eric M. Burke. Java and XSLT O’Reilly&Associates,Inc. 2001

Copyright: Xingchen Chu@Copyright Reserved(c) 2004 Melbourne University

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有