PowerDesign的Pdm文件读取代码(C#)
PowerDesign进行表结构设计还是比较好,但有的时候想利用设计信息构造一些工具型程序,比如数据库结构同步,自动生成实体,还是比较麻烦.pdm文件采用的xml格式,要读取pdm文件,技术上实现这个不是很难,主要是体力活,以下代码参照了网友的代码,并在此基础上进行了完善,在此分享给大家,以减少不必要的体力劳动:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PdmFileSimpleReader{ /// <summary> /// 表列信息 /// </summary> public class ColumnInfo { private TableInfo _OwnerTable; /// <summary> /// 所属表 /// </summary> public TableInfo OwnerTable { get { return _OwnerTable; } } public ColumnInfo(TableInfo OwnerTable) { this._OwnerTable = OwnerTable; } /// <summary> /// 是否主键 /// </summary> public bool IsPrimaryKey { get { PdmKey theKey = _OwnerTable.PrimaryKey; if (theKey != null) { if (theKey.ColumnObjCodes.Contains(columnId)) { return true; } } return false; } } string columnId; /// <summary> /// 列标识 /// </summary> public string ColumnId { get { return columnId; } set { columnId = value; } } string objectID; /// <summary> /// 对象Id,全局唯一. /// </summary> public string ObjectID { get { return objectID; } set { objectID = value; } } string name; /// <summary> /// 列名 /// </summary> public string Name { get { return name; } set { name = value; } } string code; /// <summary> /// 列代码,对应数据库表字段名 /// </summary> public string Code { get { return code; } set { code = value; } } DateTime creationDate; /// <summary> /// 创建日期 /// </summary> public DateTime CreationDate { get { return creationDate; } set { creationDate = value; } } string creator; /// <summary> /// 创建人 /// </summary> public string Creator { get { return creator; } set { creator = value; } } DateTime modificationDate; /// <summary> /// 修改日期 /// </summary> public DateTime ModificationDate { get { return modificationDate; } set { modificationDate = value; } } string modifier; /// <summary> /// 修改人 /// </summary> public string Modifier { get { return modifier; } set { modifier = value; } } string comment; /// <summary> /// 注视 /// </summary> public string Comment { get { return comment; } set { comment = value; } } string dataType; /// <summary> /// 数据类型 /// </summary> public string DataType { get { return dataType; } set { dataType = value; } } string length; /// <summary> /// 数据长度 /// </summary> public string Length { get { return length; } set { length = value; } } bool identity; /// <summary> /// 是否自增量 /// </summary> public bool Identity { get { return identity; } set { identity = value; } } bool mandatory; /// <summary> /// 是否可空 /// </summary> public bool Mandatory { get { return mandatory; } set { mandatory = value; } } string extendedAttributesText; /// <summary> /// 扩展属性 /// </summary> public string ExtendedAttributesText { get { return extendedAttributesText; } set { extendedAttributesText = value; } } /// <summary> /// 物理选项 /// </summary> public string PhysicalOptions { get; set; } /// <summary> /// 精度 /// </summary> public string Precision { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PdmFileSimpleReader{ /// <summary> /// 视图信息 /// </summary> public class ViewInfo { public ViewInfo() { Columns = new List<ViewColumnInfo>(); } /// <summary> /// 视图ID /// </summary> public string ViewId{get;set;} /// <summary> /// 视图对象id /// </summary> public string ObjectId {get;set;} /// <summary> /// 视图名 /// </summary> public string Name {get;set;} /// <summary> /// 视图代码=>数据库中的视图名 /// </summary> public string Code {get;set;} /// <summary> /// 创建日期 /// </summary> public DateTime CreationDate {get;set;} /// <summary> /// 创建人 /// </summary> public string Creator { get; set; } /// <summary> /// 修改日期 /// </summary> public DateTime ModificationDate{get;set;} /// <summary> /// 修改人 /// </summary> public string Modifier {get;set;} /// <summary> /// 视图SQL /// </summary> public string ViewSQLQuery {get;set;} /// <summary> /// 注释 /// </summary> public string Comment { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } /// <summary> /// 标签化的SQL查询 /// </summary> public string TaggedSQLQuery { get; set; } /// <summary> /// 视图列集合. /// </summary> public List<ViewColumnInfo> Columns { get; private set; } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PdmFileSimpleReader{ /// <summary> /// 视图列信息 /// </summary> public class ViewColumnInfo { private ViewInfo _ViewInfo; public ViewInfo OwnerViewInfo { get { return _ViewInfo; } } public ViewColumnInfo(ViewInfo View) { _ViewInfo = View; } /// <summary> /// 列Id /// </summary> public string ViewColumnId { get; set; } /// <summary> /// 对象id /// </summary> public string ObjectID { get; set; } /// <summary> /// 列名 /// </summary> public string Name { get; set; } /// <summary> /// 列代码=>表字段名 /// </summary> public string Code { get; set; } /// <summary> /// 创建日期 /// </summary> public DateTime CreationDate { get; set; } /// <summary> /// 创建人 /// </summary> public string Creator { get; set; } /// <summary> /// 修改日期 /// </summary> public DateTime ModificationDate { get; set; } /// <summary> /// 修改人 /// </summary> public string Modifier { get; set; } /// <summary> /// 注释 /// </summary> public string Comment { get; set; } /// <summary> /// 数据类型 /// </summary> public string DataType { get; set; } /// <summary> /// 数据长度 /// </summary> public string Length { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PdmFileSimpleReader{ /// <summary> /// 表信息 /// </summary> public class TableInfo { public TableInfo() { keys = new List<PdmKey>(); columns = new List<ColumnInfo>(); } string tableId; /// <summary> /// 表ID /// </summary> public string TableId { get { return tableId; } set { tableId = value; } } string objectID; /// <summary> /// 对象ID /// </summary> public string ObjectID { get { return objectID; } set { objectID = value; } } string name; /// <summary> /// 表名 /// </summary> public string Name { get { return name; } set { name = value; } } string code; /// <summary> /// 表代码,对应数据库表名 /// </summary> public string Code { get { return code; } set { code = value; } } DateTime creationDate; /// <summary> /// 创建日期 /// </summary> public DateTime CreationDate { get { return creationDate; } set { creationDate = value; } } string creator; /// <summary> /// 创建人 /// </summary> public string Creator { get { return creator; } set { creator = value; } } DateTime modificationDate; /// <summary> /// 修改日期 /// </summary> public DateTime ModificationDate { get { return modificationDate; } set { modificationDate = value; } } string modifier; /// <summary> /// 修改人 /// </summary> public string Modifier { get { return modifier; } set { modifier = value; } } string comment; /// <summary> /// 注释 /// </summary> public string Comment { get { return comment; } set { comment = value; } } string physicalOptions; /// <summary> /// 物理选项 /// </summary> public string PhysicalOptions { get { return physicalOptions; } set { physicalOptions = value; } } IList<ColumnInfo> columns; /// <summary> /// 表列集合 /// </summary> public IList<ColumnInfo> Columns { get { return columns; } } IList<PdmKey> keys; /// <summary> /// 表Key集合 /// </summary> public IList<PdmKey> Keys { get { return keys; } } public void AddColumn(ColumnInfo mColumn) { if (columns == null) columns = new List<ColumnInfo>(); columns.Add(mColumn); } public void AddKey(PdmKey mKey) { if (keys == null) keys = new List<PdmKey>(); keys.Add(mKey); } /// <summary> /// 主键Key代码.=>KeyId /// </summary> public string PrimaryKeyRefCode { get; set; } /// <summary> /// 主关键字 /// </summary> public PdmKey PrimaryKey { get { foreach (var key in keys) { if (key.KeyId == PrimaryKeyRefCode) { return key; } } return null; } } /// <summary> /// 表的描述=>PDM Notes. /// </summary> public string Description { get; set; } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PdmFileSimpleReader{ /// <summary> /// PDM实体集合 /// </summary> public class PdmModels { public PdmModels() { Tables = new List<TableInfo>(); Views = new List<ViewInfo>(); } /// <summary> /// 表集合 /// </summary> public IList<TableInfo> Tables { get;private set; } /// <summary> /// 视图集合 /// </summary> public IList<ViewInfo> Views { get;private set; } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PdmFileSimpleReader{ /// <summary> /// 关键字 /// </summary> public class PdmKey { string keyId; /// <summary> /// 关键字标识 /// </summary> public string KeyId { get { return keyId; } set { keyId = value; } } string objectID; /// <summary> /// 对象Id /// </summary> public string ObjectID { get { return objectID; } set { objectID = value; } } string name; /// <summary> /// Key名 /// </summary> public string Name { get { return name; } set { name = value; } } string code; /// <summary> /// Key代码,对应数据库中的Key. /// </summary> public string Code { get { return code; } set { code = value; } } DateTime creationDate; /// <summary> /// 创建日期 /// </summary> public DateTime CreationDate { get { return creationDate; } set { creationDate = value; } } string creator; /// <summary> /// 创建人 /// </summary> public string Creator { get { return creator; } set { creator = value; } } DateTime modificationDate; /// <summary> /// 修改日期 /// </summary> public DateTime ModificationDate { get { return modificationDate; } set { modificationDate = value; } } string modifier; /// <summary> /// 修改人 /// </summary> public string Modifier { get { return modifier; } set { modifier = value; } } IList<ColumnInfo> columns; /// <summary> /// Key涉及的列 /// </summary> public IList<ColumnInfo> Columns { get { return columns; } } public void AddColumn(ColumnInfo mColumn) { if (columns == null) columns = new List<ColumnInfo>(); columns.Add(mColumn); } private List<string> _ColumnObjCodes = new List<string>(); /// <summary> /// Key涉及的列代码,根据辞可访问到列信息.对应列的ColumnId /// </summary> public List<string> ColumnObjCodes { get { return _ColumnObjCodes; } } public void AddColumnObjCode(string ObjCode) { _ColumnObjCodes.Add(ObjCode); } private TableInfo _OwnerTable = null; public PdmKey(TableInfo table) { _OwnerTable = table; } }}/* * 本程序代码用于读取PowerDesign的pdm文件中的表和视图信息. * Albert.Tian 编辑整理于2013-03-11 * CSDN博客地址:http://blog.csdn.net/hawksoft * 本文件参照了其它网友的代码,在此表示感谢. * 说明:基于一般在数据库中并不需要建立实际的参照(外键关联),这里没有实现 * 读取参照的方法,大家如果需要可以在此基础上进行扩展。 */using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;namespace PdmFileSimpleReader{ public class PdmFileReader { private const string a = "attribute", c = "collection", o = "object"; private const string cClasses = "c:Classes"; private const string oClass = "o:Class"; private const string cAttributes = "c:Attributes"; private const string oAttribute = "o:Attribute"; private const string cTables = "c:Tables"; private const string oTable = "o:Table"; private const string cColumns = "c:Columns"; private const string oColumn = "o:Column"; private const string cPrimaryKey = "c:PrimaryKey"; private const string cViews = "c:Views"; private const string oView = "o:View"; /// <summary>构造函数 </summary> public PdmFileReader() { } /// <summary> /// 读取指定Pdm文件的实体集合 /// </summary> /// <param name="PdmFile">Pdm文件名(全路径名)</param> /// <returns>实体集合</returns> public PdmModels ReadFromFile(string PdmFile) { XmlDocument xmlDoc; //加载文件. xmlDoc = new XmlDocument(); xmlDoc.Load(PdmFile); //必须增加xml命名空间管理,否则读取会报错. XmlNamespaceManager xmlnsManager; xmlnsManager = new XmlNamespaceManager(xmlDoc.NameTable); xmlnsManager.AddNamespace("a", "attribute"); xmlnsManager.AddNamespace("c", "collection"); xmlnsManager.AddNamespace("o", "object"); PdmModels theModels = new PdmModels(); //读取所有表节点 XmlNodeList xnTablesList = xmlDoc.SelectNodes("//" + cTables, xmlnsManager); foreach (XmlNode xmlTables in xnTablesList) { foreach (XmlNode xnTable in xmlTables.ChildNodes) { //排除快捷对象. if (xnTable.Name != "o:Shortcut") { theModels.Tables.Add(GetTable(xnTable)); } } } //读取所有视图节点. XmlNodeList xnViewsList = xmlDoc.SelectNodes("//" + cViews, xmlnsManager); foreach (XmlNode xmlViews in xnViewsList) { foreach (XmlNode xnView in xmlViews.ChildNodes) { theModels.Views.Add(GetView(xnView)); } } return theModels; } //初始化"o:View"的节点 private ViewInfo GetView(XmlNode xnView) { ViewInfo theView = new ViewInfo(); XmlElement xe = (XmlElement)xnView; theView.ViewId = xe.GetAttribute("Id"); XmlNodeList xnTProperty = xe.ChildNodes; foreach (XmlNode xnP in xnTProperty) { switch (xnP.Name) { case "a:ObjectID": theView.ObjectId = xnP.InnerText; break; case "a:Name": theView.Name = xnP.InnerText; break; case "a:Code": theView.Code = xnP.InnerText; break; case "a:CreationDate": theView.CreationDate = String2DateTime(xnP.InnerText); break; case "a:Creator": theView.Creator = xnP.InnerText; break; case "a:ModificationDate": theView.ModificationDate = String2DateTime(xnP.InnerText); break; case "a:Modifier": theView.Modifier = xnP.InnerText; break; case "a:Comment": theView.Comment = xnP.InnerText; break; case "a:Description": theView.Description = xnP.InnerText; break; case "a:View.SQLQuery": theView.ViewSQLQuery = xnP.InnerText; break; case "a:TaggedSQLQuery": theView.TaggedSQLQuery = xnP.InnerText; break; case "c:Columns": InitColumns(xnP, theView); break; } } return theView; } //初始化"o:Table"的节点 private TableInfo GetTable(XmlNode xnTable) { TableInfo mTable = new TableInfo(); XmlElement xe = (XmlElement)xnTable; mTable.TableId = xe.GetAttribute("Id"); XmlNodeList xnTProperty = xe.ChildNodes; foreach (XmlNode xnP in xnTProperty) { switch (xnP.Name) { case "a:ObjectID": mTable.ObjectID = xnP.InnerText; break; case "a:Name": mTable.Name = xnP.InnerText; break; case "a:Code": mTable.Code = xnP.InnerText; break; case "a:CreationDate": mTable.CreationDate = String2DateTime(xnP.InnerText); break; case "a:Creator": mTable.Creator = xnP.InnerText; break; case "a:ModificationDate": mTable.ModificationDate = String2DateTime(xnP.InnerText); break; case "a:Modifier": mTable.Modifier = xnP.InnerText; break; case "a:Comment": mTable.Comment = xnP.InnerText; break; case "a:PhysicalOptions": mTable.PhysicalOptions = xnP.InnerText; break; case "c:Columns": InitColumns(xnP, mTable); break; case "c:Keys": InitKeys(xnP, mTable); break; case "c:PrimaryKey": InitPrimaryKey(xnP, mTable); break; case "a:Description": mTable.Description = xnP.InnerText; break; } } return mTable; } //PDM文件中的日期格式采用的是当前日期与1970年1月1日8点之差的秒树来保存. private DateTime _BaseDateTime = new DateTime(1970, 1, 1, 8, 0, 0); private DateTime String2DateTime(string DateString) { Int64 theTicker = Int64.Parse(DateString); return _BaseDateTime.AddSeconds(theTicker); } //初始化"c:Columns"的节点 private void InitColumns(XmlNode xnColumns, TableInfo pTable) { foreach (XmlNode xnColumn in xnColumns) { pTable.AddColumn(GetColumn(xnColumn,pTable)); } } //初始化"c:Columns"的节点 private void InitColumns(XmlNode xnColumns, ViewInfo pView) { foreach (XmlNode xnColumn in xnColumns) { pView.Columns.Add(GetColumn(xnColumn, pView)); } } //初始化c:Keys"的节点 private void InitKeys(XmlNode xnKeys, TableInfo pTable) { foreach (XmlNode xnKey in xnKeys) { pTable.AddKey(GetKey(xnKey,pTable)); } } //初始化c:PrimaryKey"的节点 private void InitPrimaryKey(XmlNode xnPrimaryKey, TableInfo pTable) { pTable.PrimaryKeyRefCode= GetPrimaryKey(xnPrimaryKey); } private static Boolean ConvertToBooleanPG(Object obj) { if (obj != null) { string mStr = obj.ToString(); mStr = mStr.ToLower(); if ((mStr.Equals("y") || mStr.Equals("1")) || mStr.Equals("true")) { return true; } } return false; } private ColumnInfo GetColumn(XmlNode xnColumn,TableInfo OwnerTable) { ColumnInfo mColumn = new ColumnInfo(OwnerTable); XmlElement xe = (XmlElement)xnColumn; mColumn.ColumnId = xe.GetAttribute("Id"); XmlNodeList xnCProperty = xe.ChildNodes; foreach (XmlNode xnP in xnCProperty) { switch (xnP.Name) { case "a:ObjectID": mColumn.ObjectID = xnP.InnerText; break; case "a:Name": mColumn.Name = xnP.InnerText; break; case "a:Code": mColumn.Code = xnP.InnerText; break; case "a:CreationDate": mColumn.CreationDate = String2DateTime(xnP.InnerText); break; case "a:Creator": mColumn.Creator = xnP.InnerText; break; case "a:ModificationDate": mColumn.ModificationDate = String2DateTime(xnP.InnerText); break; case "a:Modifier": mColumn.Modifier = xnP.InnerText; break; case "a:Comment": mColumn.Comment = xnP.InnerText; break; case "a:DataType": mColumn.DataType = xnP.InnerText; break; case "a:Length": mColumn.Length = xnP.InnerText; break; case "a:Identity": mColumn.Identity = ConvertToBooleanPG(xnP.InnerText); break; case "a:Mandatory": mColumn.Mandatory = ConvertToBooleanPG(xnP.InnerText); break; case "a:PhysicalOptions": mColumn.PhysicalOptions = xnP.InnerText; break; case "a:ExtendedAttributesText": mColumn.ExtendedAttributesText = xnP.InnerText; break; case "a:Precision": mColumn.Precision = xnP.InnerText; break; } } return mColumn; } private ViewColumnInfo GetColumn(XmlNode xnColumn, ViewInfo OwnerView) { ViewColumnInfo mColumn = new ViewColumnInfo(OwnerView); XmlElement xe = (XmlElement)xnColumn; mColumn.ViewColumnId = xe.GetAttribute("Id"); XmlNodeList xnCProperty = xe.ChildNodes; foreach (XmlNode xnP in xnCProperty) { switch (xnP.Name) { case "a:ObjectID": mColumn.ObjectID = xnP.InnerText; break; case "a:Name": mColumn.Name = xnP.InnerText; break; case "a:Code": mColumn.Code = xnP.InnerText; break; case "a:CreationDate": mColumn.CreationDate =String2DateTime(xnP.InnerText); break; case "a:Creator": mColumn.Creator = xnP.InnerText; break; case "a:ModificationDate": mColumn.ModificationDate = String2DateTime(xnP.InnerText); break; case "a:Modifier": mColumn.Modifier = xnP.InnerText; break; case "a:Comment": mColumn.Comment = xnP.InnerText; break; case "a:DataType": mColumn.DataType = xnP.InnerText; break; case "a:Length": mColumn.Length = xnP.InnerText; break; case "a:Precision": mColumn.Description = xnP.InnerText; break; } } return mColumn; } private string GetPrimaryKey(XmlNode xnKey) { XmlElement xe = (XmlElement)xnKey; if (xe.ChildNodes.Count > 0) { XmlElement theKP = (XmlElement)xe.ChildNodes[0]; return theKP.GetAttribute("Ref"); } return ""; } private void InitKeyColumns(XmlNode xnKeyColumns, PdmKey Key) { XmlElement xe = (XmlElement)xnKeyColumns; XmlNodeList xnKProperty = xe.ChildNodes; foreach (XmlNode xnP in xnKProperty) { string theRef = ((XmlElement)xnP).GetAttribute("Ref"); Key.AddColumnObjCode(theRef); } } private PdmKey GetKey(XmlNode xnKey,TableInfo OwnerTable) { PdmKey mKey = new PdmKey(OwnerTable); XmlElement xe = (XmlElement)xnKey; mKey.KeyId = xe.GetAttribute("Id"); XmlNodeList xnKProperty = xe.ChildNodes; foreach (XmlNode xnP in xnKProperty) { switch (xnP.Name) { case "a:ObjectID": mKey.ObjectID = xnP.InnerText; break; case "a:Name": mKey.Name = xnP.InnerText; break; case "a:Code": mKey.Code = xnP.InnerText; break; case "a:CreationDate": mKey.CreationDate = String2DateTime(xnP.InnerText); break; case "a:Creator": mKey.Creator = xnP.InnerText; break; case "a:ModificationDate": mKey.ModificationDate = String2DateTime(xnP.InnerText); break; case "a:Modifier": mKey.Modifier = xnP.InnerText; break; case "c:Key.Columns": InitKeyColumns(xnP, mKey); break; } } return mKey; } }}
以上代码在vs2010,pd16上测试通过.