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

原创 2004年05月07日 15:57:00

XMLXSLT实现代码生成器(V)完

 

生成JDOM文档<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

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));

图形化代码生成器

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

总结

       本文第一部分介绍了如何使用XMLXSLT实现简单的代码生成功能,第二部分讨论了如何优化生成结果并为图形化需求提供动态XML数据生成功能。本文的目的并不是针对JavaBean代码生成(因为一个只是自动生成JavaBean代码的系统是没有多少吸引力,有很多系统都提供这一功能),而是利用XML&XSLT的组合提供一种针对代码生成问题的轻量级解决方案。读者可以考虑JAXB提供的利用XML Schema自动生成Java对象的功能,使用本文的解决方案可以实现完全同样的功能。类似的问题诸如自动生成Java RMI对象,自动生成EJB类,自动生成WebEJB配制文件,为开发中的类自动生成单元测试代码以及为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

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

XML和XSLT实现代码生成器(I)摘要       XML和XSLT为开发WEB应用提供了非常好的解决方案,然而,它们的能力不仅限制在WEB开发上,其实它们提供了很好的基于元数据(meta data...
  • starchu1981
  • starchu1981
  • 2004年04月28日 00:00
  • 2738

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

XML和XSLT实现代码生成器(II)XSLT处理元数据       如前文所述,当建立元数据以后,就可以使用XSLT将XML数据转换为实际的代码了,列表1.3展示了一个XSL文档,它将处理上述的XM...
  • starchu1981
  • starchu1981
  • 2004年04月28日 00:00
  • 2579

XML/XSD/XSLT

XSD(XML Schema Definition) XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schem...
  • lein_wang
  • lein_wang
  • 2012年07月30日 11:27
  • 1610

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

 XML和XSLT实现代码生成器(III) XSLT处理元数据(续)   —命名模板,打印set方法à                    public void set          —属性首...
  • starchu1981
  • starchu1981
  • 2004年04月27日 23:54
  • 2099

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

XML和XSLT实现代码生成器(IV)结果处理       本文第一部分描述了如何使用静态XML文档和XSLT以及一个简单的Java转换程序实现基本的代码生成器,然而通过分析结果,我的实现至少还有两点...
  • starchu1981
  • starchu1981
  • 2004年05月11日 11:03
  • 1389

[XML]学习笔记(八)XSLT

一、XSL(eXtensible Stylesheet Language)扩展样式表语言:主要包含三个部分——XSLT用于XML文档转换,XPath用于在XML文档中导航,XSL-FO用于XML文档格...
  • CristianoJason
  • CristianoJason
  • 2016年05月20日 00:45
  • 4478

通过XSLT转换XML

一 介绍 XSLT是一种用来转换XML文档结构的语言,它是EXtensible Style Language Extensions Transformations的缩写。 XSLT类似与HTML中...
  • chengqiuming
  • chengqiuming
  • 2017年04月12日 10:47
  • 599

js通过xmldom调用xslt对xml排序输出的一个简单例子.

 test.xmlxml version="1.0" encoding="utf-8" ?>xml-stylesheet type="text/xsl" href="Test.xsl"?>-->roo...
  • fcuandy
  • fcuandy
  • 2007年12月13日 23:59
  • 1271

XSLT——XML样式表转换语言

XML样式表转换语言 1. XSLT是XSLTransformations的缩写,它是XSL的一个组成部分。 XSL(EXtensible StyleSheet)由三部分组成: –  XSLT。...
  • liaoqianwen123
  • liaoqianwen123
  • 2014年04月02日 22:42
  • 1971

在C#中用xslt文件格式化转换xml

book.xml: The Autobiography of Benjamin Franklin Benjamin Franklin ...
  • zhulongxi
  • zhulongxi
  • 2016年09月09日 17:43
  • 159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XML和XSLT实现代码生成器(V)
举报原因:
原因补充:

(最多只允许输入30个字)