XML和XSLT實現程式碼生成器(V)
XML和XSLT實現程式碼生成器(V)完
生成JDOM文件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
當我們定義好資料模型後,下一步就是將資料模型轉換為JDOM文件結構。這裡可以有不同的設計方式:可以為每個Java類定義對應的工具類用於生成JDOM的Element;也可以在每個Java類中新增一個方法用於轉換;還可以建立JDOM的Element類的定製子類,在子類中,建構函式可以將資料物件作為引數傳入。不論使用哪種方法,一致性是最重要的目標[1]。實現非常簡單,只要根據DTD
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 XSLTO’Reilly&Associates,Inc. 2001
Copyright: Xingchen [email protected] Reserved(c) 2004 Melbourne University
相關推薦
XML和XSLT實現程式碼生成器(V)
XML和XSLT實現程式碼生成器(V)完 生成JDOM文件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 當我們定義好資料模型後,下一步就是將資料模型轉換為
利用JAXB實現xml和bean之間的轉換(一)
JAXB能夠使用Jackson對JAXB註解的支援實現(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,這樣一來可以更好的標誌可以轉換為JSON物件的JAVA類。 JDK中JAXB相關的重要Class和Interfac
利用Digester實現xml和bean之間的轉換(二)
Digester框架屬於Jakarta Commons,它以規則和模式為基礎處理XML文件。與SAX和DOM之類的標準API相比,Digester不涉及太多的細節問題,非常適合於對XML文件進行簡單的處理。 比如要解析如下的xml檔案 <pers
Nginx 和 IIS 實現動靜分離(轉)
host rar web應用 localhost nginx服務器 .net 復雜 jpeg post 轉載地址:https://www.cnblogs.com/paul8339/p/5825201.html 動靜分離,說白了,就是將網站靜態資源(HTML,JavaScr
設計一款c#自動程式碼生成器 (1)
1,構思配置驅動檔案生成 網上自動化指令碼生成的思路是 1)設定好對應的模板 2)讀取資料庫對應的檔案 3)根據模板對應的欄位替換生成 模板》讀取資料》生成對應檔案 為什麼會有做自動化指令碼的想法,是因為工作中發現protobuf 這個工具可以自動編譯根據伺服器生成對應的cs檔案 所以我這裡想仿
瀏覽器和伺服器實現跨域(CORS)判定的原理
同源策略 同源指的是域名(或IP),協議,埠都相同,不同源的客戶端指令碼(javascript、ActionScript)在沒明確授權的情況下,不能讀寫對方的資源。 同源的判定: 以http://www.example.com/dir/page.html為例,以下表格指出了不同
核心的配置和編譯及程式碼分析(一)
關於核心的配置和編譯和uboot是一樣的 1 解壓縮 2 打patch 3 配置核心 4 編譯 配置核心有3種方法: 1 make menuconfig這樣就需要配置所有的配置項 2 使用預設的配置,在其上面做修改。在arch/arm/configs下有很多預設的配置,XX
Spring的AOP(xml和註解實現AOP,以及代理模式)
AOP術語: 連線點(Joinpoint):程式執行的某一個特定位置,如類初始前後,方法的執行前後。而Spring只支援方法的連線點。 切點(Pointcut):切點可以定位到相應的連線點,一個切點可以定位多個連線點。&
PHP 知識補全 —— 生成器 (generator)和協程的實現
先說一些廢話 PHP 5.5 以來,新的諸多特性又一次令 PHP 煥發新的光彩,雖然在本文寫的時候已是 PHP 7 alpha 2 釋出後的一段時間,但此時國內依舊是 php 5.3 的天下。不過我認為新的特性遲早會因為舊的版本的逐漸消失而變得越發重要,尤其是 PHP 7 的正式版出來後,因此本
javaweb專案:使用者(登入和登出)實現 SSM框架(mybatis-generator自動生成程式碼)
SSM框架的搭建環境(Spring,SpringMVC,Mybatis) 使用工具:maven、idea、tomcat用的是8、jdk版本1.8 一、整個專案的結構: 使用者模組流程 pom.xml -> web.xml -> db->model
郵件實現詳解(四)------JavaMail 發送(帶圖片和附件)和接收郵件
發送 網絡圖 發送對象 true n) com 訪問權限 sub map 好了,進入這個系列教程最主要的步驟了,前面郵件的理論知識我們都了解了,那麽這篇博客我們將用代碼完成郵件的發送。這在實際項目中應用的非常廣泛,比如註冊需要發送郵件進行賬號激活,再比如OA項目中利用郵
WCF 設計和實現服務協定(01)
equal del 時間 center tracking ng- size 實用 數據 作者:jiankunking 出處:http://blog.csdn.net/jiankunkingWCF 術語:? 消息 – 消息是一
通過python實現TCP在客戶端和伺服器上的單(多)執行緒的程式設計
1、只支援一個客戶端訪問 伺服器: from socket import * address='127.0.0.1' #監聽哪些網路 127.0.0.1是監聽本機 0.0.0.0是監聽整個網路 port=12345 #監聽自己的哪個埠 buffsize=
TypeScript筆記:迭代器和生成器(八)
可迭代性 當一個物件實現了Symbol.iterator屬性時,我們認為它是可迭代的。 一些內建的型別如 Array,Map,Set,String,Int32Array,Uint32Array等都已經實現了各自的Symbol.iterator。 物件上的Symbol.it
【JEECG-Mybatis版本】springmvc+mybatis+程式碼生成器(程式碼一鍵生成)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Vivado HLS實現FIR濾波器(1)——使用官方C程式碼實現FIR
使用官方C程式碼實現FIR 參考資料: 不同點說明 程式結構 C語言程式碼 模擬綜合 參考資料: 教程——基於HLS實現FIR濾波器https://blog.csdn.net/LZY27
基於Visual C++之Windows核心程式設計程式碼分析(1)實現裝置管理器列舉裝置
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
利用EasySQLMAIL實現自動數據提取和郵件發送功能 (1)
結果 收費 自動 san exce align 初始 方便 間隔 轉自:http://blog.sina.com.cn/s/blog_1549483b70102wioy.html 最近幾個月每天都在發通報。過程很繁瑣,動作很機械,整個人就是一部機器,執行SQL,填Excel
Oracle Database 12c DBA文官手冊(第8版)——第5章 開發和實現應用程式(續)
5.2、資源管理5.2.1、實現資料庫資源管理需要建立資源計劃、資源消費者組和資源計劃指令。使用資源管理器命令前須建立“未決區域”。針對會話啟用ADMINISTRATOR_RESOURCE_MAANAGER系統許可權將使用者賦給資源消費者組建立資源計劃指令分配相關資源1 切換消費者組2 使用SQL配置檔案5.
Oracle Database 12c DBA文官手冊(第8版)——第5章 開發和實現應用程序(續)
調整 pac 生成 bms 百分比 列數 改變 應用程序 數據塊 5.2、資源管理5.2.1、實現數據庫資源管理需要創建資源計劃、資源消費者組和資源計劃指令。使用資源管理器命令前須創建“未決區域”。針對會話啟用ADMINISTRATOR_RESOURCE_MAANAGER系