pdm 将注释信息转换为列名

概述:

项目开发的时候,数据库使用oracle,由于开发不规范,未先设计pdm,而是直接在数据库创建表,并在备注中维护列的中文描述信息;项目验收的时候,需要再整理pdm文档。
通过power designer 的反向工程,可以基于sql语句直接生成pdm文档,但是关于数据列的中文名称无法通过反向工程生成,如果涉及的表非常多,则比较耗时;
本文基于pdm文档,将备注信息补充到数据列中文名中:

原始pdm文件

数据库表结构如下:
pdm 将注释信息转换为列名_第1张图片
数据库表备注信息:
pdm 将注释信息转换为列名_第2张图片
数据列信息:
pdm 将注释信息转换为列名_第3张图片
数据列备注信息:
pdm 将注释信息转换为列名_第4张图片

转换后的pdm文件

pdm 将注释信息转换为列名_第5张图片

通过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 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 将注释信息转换为列名_第6张图片

注意事项

此方法仅为补救措施,建议先写pdm在生成库表结构;

你可能感兴趣的:(java)