• 一个简单的powerdesigner模型(oom,pdm)分析器


      由于工作需要,写了一个简单的模型分析器,源码:

    代码
        /// <summary>
        
    /// 通过Xml分析powerdesigner模型文件
        
    /// </summary>
        public class ModelAnalyserLinq : IModelAnalyser
        {  

            
    /// <summary>
            
    /// Xml命名空间管理
            
    /// </summary>
            XmlNamespaceManager nsmgr = null;

            
    /// <summary>
            
    /// 属性列表,记录字段
            
    /// </summary>
            List<ModelElement> listAtt = new List<ModelElement>();

            
    /// <summary>
            
    /// 单元列表:记录领域对象列表或者数据库表对象列表
            
    /// </summary>
            List<ModelElement> listUnit = new List<ModelElement>();

            
    /// <summary>
            
    /// 
            
    /// </summary>
            ModelType _mt = ModelType.Domain;

            
    /// <summary>
            
    /// 一个ModelAnalyser对应一个XElement root
            
    /// </summary>
            XElement root = null;

            
    public ModelAnalyserLinq(String fileName)
                : 
    this(fileName, ModelType.Domain)
            {
                
    try
                {
                    
    //执行linq检索(element) 
                    var classesNodes  = from element in root.Descendants(Const.c + "Classes")
                              select element; 

                    
    if (classesNodes.Count<XElement>() > 0)//说明存在类型,就是领域模型,数据库模型中不存在这个的
                    {
                        _mt 
    = ModelType.Domain;
                    }
                    
    else
                    {
                        var tablesNodes 
    = from element in root.Descendants(Const.c + "Tables")
                                 select element;

                        
    if (tablesNodes.Count<XElement>() > 0)//说明存在类型,就是数据库模型
                        {
                            _mt 
    = ModelType.Database;
                        }
                        
    else
                        {
                            
    throw new Exception("非法模型文件,系统只支持领域模型和数据库模型!");
                        }

                    }

                }
                
    catch (Exception e)
                {
                    MessageBox.Show(
    "读取model出错!\r\n" + e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }

            
    public ModelAnalyserLinq(String fileName, ModelType mt)
            {
                
    try
                {
                    _mt 
    = mt;
                    root 
    = XElement.Load(fileName);
                }
                
    catch (Exception e)
                {
                    MessageBox.Show(
    "读取model出错!\r\n" + e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }

            
    public ModelType MT
            {
                
    get { return _mt; }
            }

            
    /// <summary>
            
    /// 获取模型的基本对象集合,特指表集合或者实体集合
            
    /// </summary>
            
    /// <returns></returns>
            public List<ModelElement> GetObjectList()
            {
                List
    <ModelElement> list = new List<ModelElement>();
                
    if (_mt == ModelType.Domain)
                {

                    var classNodes 
    = from element in root.Descendants(Const.o + "Class")
                                     
    where element.Parent !=null
                                     
    && element.Parent.Name == Const.c + "Classes"
                                       select element;

                    
    foreach (XElement n in classNodes)
                    {
                        ModelElement attr 
    = GenerateElementFromNode(n);
                        list.Add(attr);
                    }
                
                }
                
    else
                {
                    var tableNodes 
    = from element in root.Descendants(Const.o + "Table")
                                     
    where element.Parent != null
                                    
    && element.Parent.Name == Const.c + "Tables"
                                     select element;

                    
    foreach (XElement n in tableNodes)
                    {
                        ModelElement attr 
    = GenerateElementFromNode(n);
                        IEnumerable
    <XElement>  tmp = n.Descendants(Const.a + "Comment");
                        
    if (tmp.Count<XElement>() > 0 )
                        {
                            attr.Comment 
    = tmp.First<XElement>().Value;
                        }
                        list.Add(attr);
                    }
                }
          
                
    return list;
            }

            
    /// <summary>
            
    /// 根据xml节点获取对应的ModelElement
            
    /// </summary>
            
    /// <param name="n"></param>
            
    /// <returns></returns>
            private ModelElement GenerateElementFromNode(XElement n)
            {      
                ModelElement attr 
    = new ModelElement();

                attr.Code 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "Code");
                attr.CreationDate 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "CreationDate");
                attr.Creator 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "Creator");
                attr.ModificationDate 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "ModificationDate");
                attr.Modifier 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "Modifier");
                attr.Name 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "Name");
                attr.ObjectID 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "ObjectID");
                attr.Code 
    = GetElementValueFromClassTable(n.FirstAttribute.Value, "Code");

                
    return attr;
            }

            
    private  String GetElementValueFromClassTable(string classID, string property)
            {
                IEnumerable
    <XElement> tmpList = from t2 in root.Descendants(Const.a + property)
                                                
    where t2.Parent != null
                                                    
    && t2.Parent.FirstAttribute != null
                                                    
    && t2.Parent.FirstAttribute.Value == classID
                                                select t2;
                
    if (tmpList.Count<XElement>() == 0)
                    
    return String.Empty;
                
    return tmpList.First<XElement>().Value;
            }

            
    /// <summary>
            
    /// 根据对象ID找到属性列表
            
    /// </summary>
            
    /// <param name="objectID"></param>
            
    /// <returns></returns>
            public List<ModelElement> GetAttributeList(string objectID)
            {
                List
    <ModelElement> list = new List<ModelElement>();
                XElement node 
    = FindNodeByObjectID(objectID);

                
    string classOrTable = String.Empty;

                
    if (_mt == ModelType.Domain)
                {
                    classOrTable 
    = "Attribute";
                }
                
    else
                {
                    classOrTable 
    = "Column";
                }

                IEnumerable
    <XElement> listAttr =
                            from el 
    in root.Descendants(Const.o + classOrTable)
                            
    where el.Parent != null
                            
    && el.Parent .Parent != null
                            
    && el.Parent.Parent.FirstAttribute != null
                            
    && FindNodeByObjectID(objectID) != null
                            
    && FindNodeByObjectID(objectID).Parent  != null
                            
    && FindNodeByObjectID(objectID).Parent.FirstAttribute != null
                            
    && el.Parent.Parent.FirstAttribute.Value == FindNodeByObjectID(objectID).Parent.FirstAttribute.Value
                            select el;

                
    foreach (XElement n in listAttr)
                {
                    ModelElement ma 
    = GenerateElementFromNode(n);
                    list.Add(ma);
                }
                
    return list;
            }

            
    /// <summary>
            
    /// 根据对象id(guid)找到对应的节点
            
    /// </summary>
            
    /// <param name="objectID"></param>
            
    /// <returns></returns>
            private XElement FindNodeByObjectID(string objectID)
            {
                IEnumerable
    <XElement> list =
                                from el 
    in root.Descendants(Const.a + "ObjectID")
                                
    where el.Value == objectID
                                select el;
                
    if (list.Count<XElement>() > 0)
                    
    return list.First<XElement>();
                
    else
                    
    return null;
            
            }

        }
    代码
     class Const
        {
            
    public readonly static XNamespace 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";
        }
    代码
     interface  IModelAnalyser
        {
            List
    <ModelElement> GetAttributeList(string objectID);
            List
    <ModelElement> GetObjectList();
            ModelType MT { 
    get; }
        }


        
    /// <summary>
        
    /// xml节点entity,可以指定类型:table,class,column,attribute等
        
    /// </summary>
        public class ModelElement
        {
            
    /// <summary>
            
    /// 重写ToString(),给ListView显示用
            
    /// </summary>
            
    /// <returns></returns>
            public override string ToString()
            {
                
    return Name + Code + (String.IsNullOrEmpty(Comment) ? "" : Comment);
            }

            
    //<a:ObjectID>DE001EE1-B9D8-4904-AA97-1CB93DAE107E</a:ObjectID>
            public string ObjectID { getset; }
            
    //<a:Name>类型</a:Name>
            public string Name { getset; }
            
    //<a:Code>类型</a:Code>
            public string Code { getset; }
            
    //<a:CreationDate>1271233784</a:CreationDate>
            public string CreationDate { getset; }
            
    //<a:Creator>xiaxilin</a:Creator>
            public string Creator { getset; }
            
    //<a:ModificationDate>1271233784</a:ModificationDate>
            public string ModificationDate { getset; }
            
    //<a:Modifier>xiaxilin</a:Modifier>
            public string Modifier { getset; }
            
    //<a:DataType>java.lang.String</a:DataType>
            public string DataType { getset; }
            
    //<a:Attribute.Visibility>-</a:Attribute.Visibility>
            public string Visibility { getset; }
            
    //<a:Comment>-</a:Comment>
            public string Comment { getset; }

        }

        
    /// <summary>
        
    /// 模型类型
        
    /// </summary>
        public enum ModelType
        {
            
    /// <summary>
            
    /// 领域模型
            
    /// </summary>
            Domain = 0,

            
    /// <summary>
            
    /// 数据库模型
            
    /// </summary>
            Database = 1
        }
    代码
      /// <summary>
        
    /// 通过Xml分析powerdesigner模型文件
        
    /// </summary>
        public class ModelAnalyser : IModelAnalyser
        {
       

            
    /// <summary>
            
    /// Xml命名空间管理
            
    /// </summary>
            XmlNamespaceManager nsmgr = null;

            
    /// <summary>
            
    /// 属性列表,记录字段
            
    /// </summary>
            List<ModelElement> listAtt = new List<ModelElement>();

            
    /// <summary>
            
    /// 单元列表:记录领域对象列表或者数据库表对象列表
            
    /// </summary>
            List<ModelElement> listUnit = new List<ModelElement>();

            
    /// <summary>
            
    /// 
            
    /// </summary>
            ModelType _mt = ModelType.Domain;

            
    /// <summary>
            
    /// 一个ModelAnalyser对应一个xmldocument
            
    /// </summary>
            XmlDocument xd = new XmlDocument();

            
    public ModelAnalyser(String fileName)
                : 
    this(fileName, ModelType.Domain)
            {
                
    try
                {
                    XmlNode node 
    = xd.SelectSingleNode("//" + Const.cClasses, nsmgr);
                    
    if (node != null)//说明存在类型,就是领域模型,数据库模型中不存在这个的
                    {
                        _mt 
    = ModelType.Domain;
                    }
                    
    else
                    {
                        XmlNode node2 
    = xd.SelectSingleNode("//" + Const.cTables, nsmgr);
                        
    if (node2 != null)//说明存在类型,就是数据库模型
                        {
                            _mt 
    = ModelType.Database;
                        }
                        
    else
                        {
                            
    throw new Exception("非法模型文件,系统只支持领域模型和数据库模型!");
                        }

                    }

                }
                
    catch (Exception e)
                {
                    MessageBox.Show(
    "读取model出错!\r\n" + e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }

            
    public ModelAnalyser(String fileName, ModelType mt)
            {
                
    try
                {
                    _mt 
    = mt;
                    xd.Load(fileName);

                    nsmgr 
    = new XmlNamespaceManager(xd.NameTable);
                    nsmgr.AddNamespace(
    "a""attribute");
                    nsmgr.AddNamespace(
    "c""collection");
                    nsmgr.AddNamespace(
    "o""object");

                }
                
    catch (Exception e)
                {
                    MessageBox.Show(
    "读取model出错!\r\n" + e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }

            
    public ModelType MT
            {
                
    get { return _mt; }
            }

            
    /// <summary>
            
    /// 获取模型的基本对象集合,特指表集合或者实体集合
            
    /// </summary>
            
    /// <returns></returns>
            public List<ModelElement> GetObjectList()
            {
                List
    <ModelElement> list = new List<ModelElement>();
                
    if (_mt == ModelType.Domain)
                {
                    XmlNode node 
    = xd.SelectSingleNode("//" + Const.cClasses, nsmgr);
                    
    if (node != null)
                    {
                        
    foreach (XmlNode n in node.ChildNodes)
                        {
                            ModelElement attr 
    = GenerateElementFromNode(n);
                            list.Add(attr);
                        }
                    }
                }
                
    else
                {
                    XmlNode node 
    = xd.SelectSingleNode("//" + Const.cTables, nsmgr);
                    
    if (node != null)
                    {
                        
    foreach (XmlNode n in node.ChildNodes)
                        {
                            ModelElement attr 
    = GenerateElementFromNode(n);
                            XmlNode tmp 
    = n.SelectSingleNode("a:Comment", nsmgr);
                            
    if (tmp != null)
                            {
                                attr.Comment 
    = tmp.InnerText;
                            }
                            list.Add(attr);
                        }
                    }
                }
                
    return list;
            }

            
    /// <summary>
            
    /// 根据xml节点获取对应的ModelElement
            
    /// </summary>
            
    /// <param name="n"></param>
            
    /// <returns></returns>
            private ModelElement GenerateElementFromNode(XmlNode n)
            {
                ModelElement attr 
    = new ModelElement();
                attr.Code 
    = n.SelectSingleNode("a:Code", nsmgr).InnerText;
                attr.CreationDate 
    = n.SelectSingleNode("a:CreationDate", nsmgr).InnerText;
                attr.Creator 
    = n.SelectSingleNode("a:Creator", nsmgr).InnerText;
                attr.ModificationDate 
    = n.SelectSingleNode("a:ModificationDate", nsmgr).InnerText;
                attr.Modifier 
    = n.SelectSingleNode("a:Modifier", nsmgr).InnerText;
                attr.Name 
    = n.SelectSingleNode("a:Name", nsmgr).InnerText;
                attr.ObjectID 
    = n.SelectSingleNode("a:ObjectID", nsmgr).InnerText;
                
    return attr;
            }

            
    /// <summary>
            
    /// 根据对象ID找到属性列表
            
    /// </summary>
            
    /// <param name="objectID"></param>
            
    /// <returns></returns>
            public List<ModelElement> GetAttributeList(string objectID)
            {
                List
    <ModelElement> list = new List<ModelElement>();
                XmlNode node 
    = FindNodeByObjectID(objectID);
                
    foreach (XmlNode n in node.ChildNodes)
                {
                    ModelElement ma 
    = GenerateElementFromNode(n);
                    list.Add(ma);
                }
                
    return list;
            }

            
    /// <summary>
            
    /// 根据对象id(guid)找到对应的节点
            
    /// </summary>
            
    /// <param name="objectID"></param>
            
    /// <returns></returns>
            private XmlNode FindNodeByObjectID(string objectID)
            {
                XmlNodeList nodeList 
    = null;
                
    if (_mt == ModelType.Domain)
                {
                    nodeList 
    = xd.SelectSingleNode("//" + Const.cClasses, nsmgr).ChildNodes;
                }
                
    else
                {
                    nodeList 
    = xd.SelectSingleNode("//" + Const.cTables, nsmgr).ChildNodes;
                }

                
    foreach (XmlNode n in nodeList)
                {
                    
    if (n.SelectSingleNode("a:ObjectID", nsmgr).InnerText == objectID)
                    {
                        
    if (_mt == ModelType.Domain)
                        {
                            
    return n.SelectSingleNode("//" + Const.cAttributes, nsmgr);
                        }
                        
    else
                        {
                            
    return n.SelectSingleNode("//" + Const.cColumns, nsmgr);
                        }
                    }
                }
                
    return null;
            }

        }
  • 相关阅读:
    hibernate中获得session的方式
    html中meta的介绍
    dwr和spring的整合
    hibernate.hbm2ddl.auto配置详解
    java生成二维码(需导入第三方ZXing.jar包)
    公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记
    SQL case when 遇到null值
    OpenLayers 3 之 地图图层数据来源(ol.source)详解
    公共语言运行库(CLR)开发系列课程(3):COM Interop基础 学习笔记
    公共语言运行库(CLR)开发系列课程(2):Pinvoke 进阶 学习笔记
  • 原文地址:https://www.cnblogs.com/sinxsoft/p/1740678.html
Copyright © 2020-2023  润新知