很多人在第一眼看到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();
}
}
}