Java中的dom4j解析pdm文档

很多人在第一眼看到pdm文档的时候,和我一样,都是”萌比”的。其实有心人已经看出来了,我写的是pdm文档,而没有写pdm文件,从这里可以简单看出,pdm是文本文档,事实是,它确实是文本文档,不信你可以找一个pdm文档用记事本打开试试。
再往深层次去说,他是XML文件,查看的时候可以先拷贝一份,把后缀名改为xml形式,这样就可以在浏览器中方便地进行查看了。
Java解析xml文件需要两个jar包支撑。据说jre自己也有解析包,但是好像不太有人用。这里就推荐使用dom4j和jaxen。可以在这里下载(前提是网站在):http://www.manyjar.com/

使用的资源:
版本为dom4j-2.0.0-ALPHA-2.jar和jaxen-1.1.2.jar。解析文件http://pan.baidu.com/s/1qYxknog密码6eb3

下面介绍常用的对象和方发

1、SAXReader reader = new SAXReader();
File pdm = new File(URI);
Document doc = reader.read(pdm);
Element root = doc.getRootElement();//获取到根节点元素

2、Element e = root.selectSingleNode("//c:Tables");
//得到根节点中第一个全局限定名(我定义:命名空间+节点名)为Tables的节点元素

3、对象的方法:Element e1 = e.element("Table");//获取名为Table的儿子节点。

List<Element> tableNodes = e.elements();//获取e元素下所有儿子节点。

String str = e..attributeValue("Ref");//获取e元素上属性为Ref的属性值

String str = e.elementText("Name");//获取e元素下儿子节点名为Name的节点文本信息
4、下面闻文件的整个代码
4.1 Domain存放作用域信息
package data.mining;

public class Domain {
    private String domainId;
    private String domainName;
    public String getDomainId() {
        return domainId;
    }
    public void setDomainId(String domainId) {
        this.domainId = domainId;
    }
    public String getDomainName() {
        return domainName;
    }
    public void setDomainName(String domainName) {
        this.domainName = domainName;
    }
}
4.2 Reference存放外键关系
package data.mining;

public class Reference {
    private String FKId;
    private String parentId;
    public String getFKId() {
        return FKId;
    }
    public void setFKId(String fKId) {
        FKId = fKId;
    }
    public String getParentId() {
        return parentId;
    }
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
}
4.3 Column 存放表的字段
package data.mining;

public class Column {
    private String colId;
    private String colName;
    private String colCode;
    private String colDomain;
    private String colComment;
    private boolean FK;
    private boolean PK;
    public String getColId() {
        return colId;
    }
    public void setColId(String colId) {
        this.colId = colId;
    }
    public String getColName() {
        return colName;
    }
    public void setColName(String colName) {
        this.colName = colName;
    }
    public String getColCode() {
        return colCode;
    }
    public void setColCode(String colCode) {
        this.colCode = colCode;
    }
    public String getColDomain() {
        return colDomain;
    }
    public void setColDomain(String colDomain) {
        this.colDomain = colDomain;
    }
    public String getColComment() {
        return colComment;
    }
    public void setColComment(String colComment) {
        this.colComment = colComment;
    }
    public boolean isFK() {
        return FK;
    }
    public void setFK(boolean fK) {
        FK = fK;
    }
    public boolean isPK() {
        return PK;
    }
    public void setPK(boolean pK) {
        PK = pK;
    }
}
4.4 Table 存放表
package data.mining;

import java.util.List;

public class Table {
    private String tableId;
    private String tableName;
    private String tableCode;
    private String parentTableId;
    private List<Column> allColumns;
    public String getTableId() {
        return tableId;
    }
    public void setTableId(String tableId) {
        this.tableId = tableId;
    }
    public String getTableName() {
        return tableName;
    }
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
    public String getTableCode() {
        return tableCode;
    }
    public void setTableCode(String tableCode) {
        this.tableCode = tableCode;
    }
    public List<Column> getAllColumns() {
        return allColumns;
    }
    public void setAllColumns(List<Column> allColumns) {
        this.allColumns = allColumns;
    }
    public String getParentTableId() {
        return parentTableId;
    }
    public void setParentTableId(String parentTableId) {
        this.parentTableId = parentTableId;
    }
}
4.5 ParsePDM 解析程序
package data.mining;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ParsePDM {
    private Element root;
    public ParsePDM() throws DocumentException{
        SAXReader reader = new SAXReader();
        File pdm = new File("src/LCS-客户模块.pdm");
        Document doc = reader.read(pdm);
        root = doc.getRootElement();
    }
    /**
     * 加载所有domains
     * @param args
     */
    public List<Domain> loadAllDomains(){
        List<Domain> allDomains = new ArrayList<Domain>();
        Element domainNode = (Element) root.selectSingleNode("//c:Domains");
        for(Element e:domainNode.elements()){
            Domain domain = new Domain();
            String domainId = e.attributeValue("Id");
            String domainName = e.elementText("Name");
            domain.setDomainId(domainId);
            domain.setDomainName(domainName);
            allDomains.add(domain);
        }

        return allDomains;
    }
    /**
     * 加载所有references,外键关系
     * @param args
     */
    public List<Reference> loadAllReferences(){
        List<Reference> allReferences = new ArrayList<Reference>();
        Element refNode = (Element) root.selectSingleNode("//c:References");
        for(Element e:refNode.elements()){
            Reference ref = new Reference();
            String parentId = e.element("ParentTable").element("Table").attributeValue("Ref");
            String FKId = e.element("Joins").element("ReferenceJoin").element("Object2").element("Column").attributeValue("Ref");
            ref.setFKId(FKId);
            ref.setParentId(parentId);
            allReferences.add(ref);
        }
        return allReferences;
    }
    /**
     * 加载所有主键Id
     * @param args
     */
    public List<String> loadAllPKIds(){
        List<String> allPKIds = new ArrayList<String>();
        Element tableNode = (Element) root.selectSingleNode("//c:Tables");
        for(Element e:tableNode.elements()){
            //判断是否有主键
            Element keys = e.element("Keys");
            if(keys != null){
                String PKId = keys.element("Key").element("Key.Columns").element("Column").attributeValue("Ref");
                allPKIds.add(PKId);
            }
        }
        return allPKIds;
    }
    /**
     * 加载table的codeLib
     */
    public Map<String,String> loadTableCodeLib(){
        Map<String,String> tableCodeLib = new HashMap<String, String>();
        Element tableNode = (Element) root.selectSingleNode("//c:Tables");
        for(Element t : tableNode.elements()){
            String id = t.attributeValue("Id");
            String name = t.elementText("Name");
            String code = t.elementText("Code");
            tableCodeLib.put(id, name+code);
        }
        return tableCodeLib;
    }
    /**
     * 加载所有的表
     * @param args
     */
    public List<Table> loadAllTables(){
        List<Table> allTables = new ArrayList<Table>();
        //主键
        List<String> allPKIds = loadAllPKIds();
        //外键
        List<Reference> allReferences = loadAllReferences();
        //作用域
        List<Domain> allDomains = loadAllDomains();

        Element tableNode = (Element) root.selectSingleNode("//c:Tables");
        for(Element t:tableNode.elements()){
            Table table = new Table();
            List<Column> allColumns = new ArrayList<Column>();
            String tableId = t.attributeValue("Id");
            String tableName = t.elementText("Name");
            String tableCode = t.elementText("Code");
            //1
            table.setTableId(tableId);
            //2
            table.setTableName(tableName);
            //3
            table.setTableCode(tableCode);
            //Column信息添加
            Element columnNode = t.element("Columns");
            for(Element col:columnNode.elements()){
                Column column = new Column();
                String columnId = col.attributeValue("Id");
                String columnName = col.elementText("Name");
                String columnCode = col.elementText("Code");
                String columnComment = col.elementText("Comment");
                String domainId = col.element("Domain").element("PhysicalDomain").attributeValue("Ref");
                String columnDomain = "";
                //根据domainId获取domainName
                for(Domain d : allDomains){
                    if(domainId.equals(d.getDomainId())){
                        columnDomain = d.getDomainName();
                    }
                }
                boolean PK = false;
                //获取主键
                if(allPKIds.contains(columnId)){
                    PK = true;
                }
                boolean FK = false;
                //获取外键
                for(Reference ref : allReferences){
                    if(columnId.equals(ref.getFKId())){
                        FK = true;
                        //4
                        table.setParentTableId(ref.getParentId());
                    }
                }
                column.setColId(columnId);
                column.setColName(columnName);
                column.setColCode(columnCode);
                column.setColComment(columnComment);
                column.setColDomain(columnDomain);
                column.setPK(PK);
                column.setFK(FK);   
                allColumns.add(column);
            }
            //5
            table.setAllColumns(allColumns);
            allTables.add(table);
        }
        return allTables;
    }
    public void printAllTables(List<Table> allTables){
        //表的id和name的表
        Map<String,String> tableCodeLib = loadTableCodeLib();
        for(Table table : allTables){
            System.out.println("--------------------------------------------------------------------------");
            System.out.println("表:"+table.getTableName()+table.getTableCode());
            for(Entry<String, String> entry:tableCodeLib.entrySet()){
                if(entry.getKey().equals(table.getParentTableId())){
                    System.out.println("parentTable:"+entry.getValue());
                }
            }
            String tablePK = "";
            String tableFK = "";
            for(Column column : table.getAllColumns()){
                System.out.println("字段:"+column.getColName()+column.getColCode()+","+"注释:"+column.getColComment()+","+"domain:"+column.getColDomain());
                if(column.isPK())tablePK += column.getColName()+column.getColCode();
                if(column.isFK())tableFK += column.getColName()+column.getColCode();
            }
            System.out.println("主键:"+tablePK+"外键:"+tableFK);
        }
    }
    public static void main(String[] args) {
        try {
            long start = System.currentTimeMillis();
            ParsePDM parsePDM = new ParsePDM();
            List<Table> allTables = parsePDM.loadAllTables();
            long end = System.currentTimeMillis();
            parsePDM.printAllTables(allTables);
            System.out.println("用时:"+(end-start));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值