概述:
项目开发的时候,数据库使用oracle,由于开发不规范,未先设计pdm,而是直接在数据库创建表,并在备注中维护列的中文描述信息;项目验收的时候,需要再整理pdm文档。
通过power designer 的反向工程,可以基于sql语句直接生成pdm文档,但是关于数据列的中文名称无法通过反向工程生成,如果涉及的表非常多,则比较耗时;
本文基于pdm文档,将备注信息补充到数据列中文名中:
原始pdm文件
数据库表结构如下:
数据库表备注信息:
数据列信息:
数据列备注信息:
转换后的pdm文件
通过java转换pdm
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* 用途:解析pdm文件,根据数据库中的字段注释,解析字段中文名称
*
*/
public class App {
public static void main(String[] args) {
String srcPath = "d:/test.pdm"; // 源pdm
String destPath = "d:/test-cn.pdm"; // 目标pdm
enToCn(srcPath, destPath);
}
private static void enToCn(String srcPath, String destPath) {
try {
SAXReader reader = new SAXReader();
// 路径名不支持中文
Document doc = reader.read(srcPath);
Element root = doc.getRootElement();
// 转换-表
commentToName(root.selectNodes("/Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table"));
// 转换-列
commentToName(
root.selectNodes("/Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table/c:Columns/o:Column"));
// 保存文件
FileOutputStream out = new FileOutputStream(destPath);// 指定文件输出的位置
// 指定写出的格式
OutputFormat format = OutputFormat.createCompactFormat();
format.setEncoding("utf-8");// 2.指定生成的xml文档的编码
XMLWriter writer = new XMLWriter(out, format);// 创建写出对象
writer.write(doc);
writer.close();
System.out.println("保存成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 将注释节点信息写入名称节点
*
* @param nodes
*/
public static void commentToName(List<Node> nodes) {
int i = 0;
for (Node node : nodes) {
Node comment = node.selectSingleNode("a:Comment");
Node name = node.selectSingleNode("a:Name");
Node code = node.selectSingleNode("a:Code");
if (comment != null) {
/* 如果注释不为空 */
System.out.println((i++) + "\t" + code.getText() + "\t" + name.getText() + "\t" + comment.getText());
name.setText(comment.getText()); // 修改名称
}
}
}
}
执行结果
执行java代码,可以完成pdm备注信息解析为列名的步骤
注意事项
此方法仅为补救措施,建议先写pdm在生成库表结构;