C#中读取pdm文件信息(PowerDesigner读取方法)(源码共享)。

其实PowerDesigner的pdm文件是一个xml文件来的,我们可以当作读取xml文件一样的方式来读pdm文件。

其中,我们需要注意的是:如果我们不使用命名空间管理器的话,系统会提示如下错误:

需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.Xml.XPath.XPathException: 需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。
因此,我们读取pdm文件代码如下:

  

ExpandedBlockStart.gif 代码
xmlDoc  =   new  XmlDocument();
xmlDoc.Load(pdmFile);
xmlnsManager 
=   new  XmlNamespaceManager(xmlDoc.NameTable);
xmlnsManager.AddNamespace(
" a " " attribute " );
xmlnsManager.AddNamespace(
" c " " collection " );
xmlnsManager.AddNamespace(
" o " " object " );
XmlNode xnTables 
=  xmlDoc.SelectSingleNode( " // "   +  cTables, xmlnsManager);

 

其实C#读取pdm文件难度并不大,只是一种体力活,为了后人少走点弯路,我下面公布一下代码:

ColumnInfo.cs(字段类)

 

ExpandedBlockStart.gif 代码

namespace  Piggy.Common.PDM
{
    
// 字段信息
     public   class  ColumnInfo
    {
        
public  ColumnInfo()
        { }

        
string  columnId;

        
public   string  ColumnId
        {
            
get  {  return  columnId; }
            
set  { columnId  =  value; }
        }
        
string  objectID;

        
public   string  ObjectID
        {
            
get  {  return  objectID; }
            
set  { objectID  =  value; }
        }
        
string  name;

        
public   string  Name
        {
            
get  {  return  name; }
            
set  { name  =  value; }
        }
        
string  code;

        
public   string  Code
        {
            
get  {  return  code; }
            
set  { code  =  value; }
        }
        
int  creationDate;

        
public   int  CreationDate
        {
            
get  {  return  creationDate; }
            
set  { creationDate  =  value; }
        }
        
string  creator;

        
public   string  Creator
        {
            
get  {  return  creator; }
            
set  { creator  =  value; }
        }
        
int  modificationDate;

        
public   int  ModificationDate
        {
            
get  {  return  modificationDate; }
            
set  { modificationDate  =  value; }
        }
        
string  modifier;

        
public   string  Modifier
        {
            
get  {  return  modifier; }
            
set  { modifier  =  value; }
        }
        
string  comment;

        
public   string  Comment
        {
            
get  {  return  comment; }
            
set  { comment  =  value; }
        }
        
string  dataType;

        
public   string  DataType
        {
            
get  {  return  dataType; }
            
set  { dataType  =  value; }
        }
        
string  length;

        
public   string  Length
        {
            
get  {  return  length; }
            
set  { length  =  value; }
        }
        
// 是否自增量
         bool  identity;

        
public   bool  Identity
        {
            
get  {  return  identity; }
            
set  { identity  =  value; }
        }
        
bool  mandatory;
        
// 禁止为空
         public   bool  Mandatory
        {
            
get  {  return  mandatory; }
            
set  { mandatory  =  value; }
        }
        
string  extendedAttributesText;
        
// 扩展属性
         public   string  ExtendedAttributesText
        {
            
get  {  return  extendedAttributesText; }
            
set  { extendedAttributesText  =  value; }
        }
        
string  physicalOptions;

        
public   string  PhysicalOptions
        {
            
get  {  return  physicalOptions; }
            
set  { physicalOptions  =  value; }
        }
    }
}

 

PdmKey.cs(主键类)

 

ExpandedBlockStart.gif 代码
using  System.Collections.Generic;

namespace  Piggy.Common.PDM
{
    
public   class  PdmKey
    {
        
public  PdmKey()
        {
        }

        
string  keyId;

        
public   string  KeyId
        {
            
get  {  return  keyId; }
            
set  { keyId  =  value; }
        }
        
string  objectID;

        
public   string  ObjectID
        {
            
get  {  return  objectID; }
            
set  { objectID  =  value; }
        }
        
string  name;

        
public   string  Name
        {
            
get  {  return  name; }
            
set  { name  =  value; }
        }
        
string  code;

        
public   string  Code
        {
            
get  {  return  code; }
            
set  { code  =  value; }
        }
        
int  creationDate;

        
public   int  CreationDate
        {
            
get  {  return  creationDate; }
            
set  { creationDate  =  value; }
        }
        
string  creator;

        
public   string  Creator
        {
            
get  {  return  creator; }
            
set  { creator  =  value; }
        }
        
int  modificationDate;

        
public   int  ModificationDate
        {
            
get  {  return  modificationDate; }
            
set  { modificationDate  =  value; }
        }
        
string  modifier;

        
public   string  Modifier
        {
            
get  {  return  modifier; }
            
set  { modifier  =  value; }
        }

        IList
< ColumnInfo >  columns;

        
public  IList < ColumnInfo >  Columns
        {
            
get  {  return  columns; }
        }

        
public   void  AddColumn(ColumnInfo mColumn)
        {
            
if  (columns  ==   null )
                columns 
=   new  List < ColumnInfo > ();
            columns.Add(mColumn);
        }
    }
}

TableInfo.cs(表信息类)

 

ExpandedBlockStart.gif 代码
using  System.Collections.Generic;

namespace  Piggy.Common.PDM
{
    
// 表信息
     public   class  TableInfo
    {
        
public  TableInfo()
        {
        }
        
string  tableId;

        
public   string  TableId
        {
            
get  {  return  tableId; }
            
set  { tableId  =  value; }
        }
        
string  objectID;

        
public   string  ObjectID
        {
            
get  {  return  objectID; }
            
set  { objectID  =  value; }
        }
        
string  name;

        
public   string  Name
        {
            
get  {  return  name; }
            
set  { name  =  value; }
        }
        
string  code;

        
public   string  Code
        {
            
get  {  return  code; }
            
set  { code  =  value; }
        }
        
int  creationDate;

        
public   int  CreationDate
        {
            
get  {  return  creationDate; }
            
set  { creationDate  =  value; }
        }
        
string  creator;

        
public   string  Creator
        {
            
get  {  return  creator; }
            
set  { creator  =  value; }
        }
        
int  modificationDate;

        
public   int  ModificationDate
        {
            
get  {  return  modificationDate; }
            
set  { modificationDate  =  value; }
        }
        
string  modifier;

        
public   string  Modifier
        {
            
get  {  return  modifier; }
            
set  { modifier  =  value; }
        }
        
string  comment;

        
public   string  Comment
        {
            
get  {  return  comment; }
            
set  { comment  =  value; }
        }

        
string  physicalOptions;

        
public   string  PhysicalOptions
        {
            
get  {  return  physicalOptions; }
            
set  { physicalOptions  =  value; }
        }


        IList
< ColumnInfo >  columns;

        
public  IList < ColumnInfo >  Columns
        {
            
get  {  return  columns; }
        }

        IList
< PdmKey >  keys;

        
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);
        }
    }
}

 

PdmReader.cs(pdm文件读取器类)

 

ExpandedBlockStart.gif 代码
using  System.Xml;
using  System.Collections.Generic;
using  System.Collections;
using  System;

namespace  Piggy.Common.PDM
{
    
public   class  PdmReader
    {
        
public   const   string  a  =   " attribute " , c  =   " collection " , o  =   " object " ;

        
public   const   string  cClasses  =   " c:Classes " ;
        
public   const   string  oClass  =   " o:Class " ;

        
public   const   string  cAttributes  =   " c:Attributes " ;
        
public   const   string  oAttribute  =   " o:Attribute " ;

        
public   const   string  cTables  =   " c:Tables " ;
        
public   const   string  oTable  =   " o:Table " ;

        
public   const   string  cColumns  =   " c:Columns " ;
        
public   const   string  oColumn  =   " o:Column " ;


        XmlDocument xmlDoc;
        XmlNamespaceManager xmlnsManager;
        
///   <summary> 构造函数  </summary>
         public  PdmReader()
        {
            
//  TODO: 在此处添加构造函数逻辑
            xmlDoc  =   new  XmlDocument();
        }
        
///   <summary> 构造函数  </summary>
         public  PdmReader( string  pdm_file)
        {
            PdmFile 
=  pdm_file;
        }

        
string  pdmFile;

        
public   string  PdmFile
        {
            
get  {  return  pdmFile; }
            
set
            {
                pdmFile 
=  value;
                
if  (xmlDoc  ==   null )
                {
                    xmlDoc 
=   new  XmlDocument();
                    xmlDoc.Load(pdmFile);
                    xmlnsManager 
=   new  XmlNamespaceManager(xmlDoc.NameTable);
                    xmlnsManager.AddNamespace(
" a " " attribute " );
                    xmlnsManager.AddNamespace(
" c " " collection " );
                    xmlnsManager.AddNamespace(
" o " " object " );
                }
            }
        }

        IList
< TableInfo >  tables;

        
public  IList < TableInfo >  Tables
        {
            
get  {  return  tables; }
            
set  { tables  =  value; }
        }

        
public   void  InitData()
        {
            
if  (Tables  ==   null )
                Tables 
=   new  List < TableInfo > ();
            XmlNode xnTables 
=  xmlDoc.SelectSingleNode( " // "   +  cTables, xmlnsManager);
            
foreach  (XmlNode xnTable  in  xnTables.ChildNodes)
            {
                Tables.Add(GetTable(xnTable));
            }
        }

        
// 初始化"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  =  Convert.ToInt32(xnP.InnerText);
                        
break ;
                    
case   " a:Creator " : mTable.Creator  =  xnP.InnerText;
                        
break ;
                    
case   " a:ModificationDate " : mTable.ModificationDate  =  Convert.ToInt32(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 ;
                }
            }
            
return  mTable;
        }
        
// 初始化"c:Columns"的节点
         private   void  InitColumns(XmlNode xnColumns, TableInfo pTable)
        {
            
foreach  (XmlNode xnColumn  in  xnColumns)
            {
                pTable.AddColumn(GetColumn(xnColumn));
            }
        }

        
// 初始化c:Keys"的节点
         private   void  InitKeys(XmlNode xnKeys, TableInfo pTable)
        {
            
foreach  (XmlNode xnKey  in  xnKeys)
            {
                pTable.AddKey(GetKey(xnKey));
            }
        }

        
private  ColumnInfo GetColumn(XmlNode xnColumn)
        {
            ColumnInfo mColumn 
=   new  ColumnInfo();
            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  =  Convert.ToInt32(xnP.InnerText);
                        
break ;
                    
case   " a:Creator " : mColumn.Creator  =  xnP.InnerText;
                        
break ;
                    
case   " a:ModificationDate " : mColumn.ModificationDate  =  Convert.ToInt32(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  =  pgConvert.ConvertStringToBoolean(xnP.InnerText);
                        
break ;
                    
case   " a:Mandatory " : mColumn.Mandatory  =  pgConvert.ConvertStringToBoolean(xnP.InnerText);
                        
break ;
                    
case   " a:PhysicalOptions " : mColumn.PhysicalOptions =  xnP.InnerText;
                        
break ;
                    
case   " a:ExtendedAttributesText " : mColumn.ExtendedAttributesText =  xnP.InnerText;
                        
break ;
                }
            }
            
return  mColumn;
        }

        
private  PdmKey GetKey(XmlNode xnKey)
        {
            PdmKey mKey 
=   new  PdmKey();
            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  =  Convert.ToInt32(xnP.InnerText);
                        
break ;
                    
case   " a:Creator " : mKey.Creator  =  xnP.InnerText;
                        
break ;
                    
case   " a:ModificationDate " : mKey.ModificationDate  =  Convert.ToInt32(xnP.InnerText);
                        
break ;
                    
case   " a:Modifier " : mKey.Modifier  =  xnP.InnerText;
                        
break ;
                        
// 还差 <c:Key.Columns>
                }
            }
            
return  mKey;
        }
    }
}

 

使用方法:

 

PdmReader mTest  =   new  PdmReader( " D:\\piggy\\CodeTest.pdm " );
mTest.InitData();
this .Text = Convert.ToString(mTest.Tables.Count);

 

上面是使用这个pdm读取器的一个应用,把读取出来的表数量列出来。这个读取器可能还有某些地方没有调整好,读取出来的表数量好像比实际的要多,有可能是快捷方式引用出来的表也算进去了。有空必须要完善一下才行。 

 由于这个pdm读取器只是初步成型,能够完成基本的相关表、字段、主键等的读取功能,由于时间与工作关系,还有更多的信息没有读取处理,在这,我开放给大家,希望大家能够不断地完善,并且希望完善的人可以把源码发给我补充上来。我完善过的代码也会在这里不定时更新。日后并提供给大家下载。由于本文是原著,并非转载。转载的朋友请加原文的链接。标明文章出处。

原创作品出自努力偷懒,转载请说明文章出处http://www.cnblogs.com/kfarvid/

转载于:https://www.cnblogs.com/kfarvid/archive/2010/11/09/PdmReader.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值