using System;
using System.Linq;
using System.Xml;
using System.Collections.Generic;
using DBCHM.PdmModels;
namespace DBCHM.PDM
{
///
/// PDM实体集合
///
public class PdmModels
{
public PdmModels()
{
this.Tables = new List();
}
///
/// 表集合
///
public IList Tables { get; private set; }
}
public class PdmReader
{
///
/// 读取指定Pdm文件的实体集合
///
/// Pdm文件名(全路径名)
/// 实体集合
public PdmModels ReadFromFile(string pdmFile)
{
if (string.IsNullOrEmpty(pdmFile))
{
return null;
}
//加载文件.
var xmlDoc = new XmlDocument();
xmlDoc.Load(pdmFile);
//必须增加xml命名空间管理,否则读取会报错.
var xmlnsManager = new XmlNamespaceManager(xmlDoc.NameTable);
xmlnsManager.AddNamespace("a", "attribute");
xmlnsManager.AddNamespace("c", "collection");
xmlnsManager.AddNamespace("o", "object");
var theModels = new PdmModels();
//读取所有表节点
var xnTablesList = xmlDoc.SelectNodes("//c:Tables", xmlnsManager);
if (xnTablesList != null)
foreach (var xnTable in from XmlNode xmlTables in xnTablesList from XmlNode xnTable in xmlTables.ChildNodes where xnTable.Name != "o:Shortcut" select xnTable)
{
theModels.Tables.Add(GetTable(xnTable));
}
return theModels;
}
//初始化"o:Table"的节点
private TableInfo GetTable(XmlNode xnTable)
{
var mTable = new TableInfo();
var xe = (XmlElement)xnTable;
mTable.TableId = xe.GetAttribute("Id");
var 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: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)
{
var mColumn = new ColumnInfo(ownerTable);
var xe = (XmlElement)xnColumn;
mColumn.ColumnId = xe.GetAttribute("Id");
var 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 string GetPrimaryKey(XmlNode xnKey)
{
var xe = (XmlElement)xnKey;
if (xe.ChildNodes.Count <= 0) return "";
var theKp = (XmlElement)xe.ChildNodes[0];
return theKp.GetAttribute("Ref");
}
private void InitKeyColumns(XmlNode xnKeyColumns, PdmKey Key)
{
var xe = (XmlElement)xnKeyColumns;
var xnKProperty = xe.ChildNodes;
foreach (var theRef in from XmlNode xnP in xnKProperty select ((XmlElement)xnP).GetAttribute("Ref"))
{
Key.AddColumnObjCode(theRef);
}
}
private PdmKey GetKey(XmlNode xnKey, TableInfo ownerTable)
{
var mKey = new PdmKey(ownerTable);
var xe = (XmlElement)xnKey;
mKey.KeyId = xe.GetAttribute("Id");
var 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;
}
}
}