http://tech.ddvip.com/2008-05/121201295944774_7.html
LoadFromPDMXMLFile和LoadFromPDMXMLDocument函数,这个函数能分析PDM格式的XML文档,找出其中的数据表和字段设计
Code
/// <summary>
/// 从PDM数据结构定义XML文件中加载数据结构信息
/// </summary>
/// <param name="doc">XML文档对象</param>
/// <returns>加载的字段信息个数</returns>
public int LoadFromPDMXMLDocument( XmlDocument doc )
{
intFillStyle = FillStyleConst.PDM ;
int RecordCount = 0 ;
myTables.Clear();
XmlNamespaceManager nsm = new XmlNamespaceManager( doc.NameTable );
nsm.AddNamespace( "a" , "attribute" );
nsm.AddNamespace( "c" , "collection" );
nsm.AddNamespace( "o" , "object");
XmlNode RootNode = doc.SelectSingleNode("/Model/o:RootObject/c:Children/o:Model" , nsm );
if( RootNode == null )
return 0 ;
strName = ReadXMLValue( RootNode , "a:Name" , nsm );
strDescription = strName ;
// 数据表
foreach( XmlNode TableNode in RootNode.SelectNodes("c:Tables/o:Table" , nsm ))
{
TableInfo table = new TableInfo();
myTables.Add( table );
table.Name = ReadXMLValue( TableNode , "a:Code" , nsm );
table.Remark = ReadXMLValue( TableNode , "a:Name" , nsm );
string keyid = ReadXMLValue( TableNode , "c:PrimaryKey/o:Key/@Ref" , nsm );
System.Collections.Specialized.StringCollection Keys =
new System.Collections.Specialized.StringCollection();
if( keyid != null )
{
foreach( XmlNode KeyNode in TableNode.SelectNodes(
"c:Keys/o:Key[@Id = '" + keyid + "']/c:Key.Columns/o:Column/@Ref" , nsm ))
{
Keys.Add( KeyNode.Value );
}
}
foreach( XmlNode FieldNode in TableNode.SelectNodes("c:Columns/o:Column" , nsm ))
{
RecordCount ++ ;
string id = ( ( XmlElement ) FieldNode).GetAttribute("Id");
FieldInfo field = new FieldInfo();
table.Fields.Add( field );
field.Name = ReadXMLValue( FieldNode , "a:Code" , nsm );
field.Remark = ReadXMLValue( FieldNode , "a:Name" , nsm );
field.Description = ReadXMLValue( FieldNode , "a:Comment" , nsm );
string FieldType = ReadXMLValue( FieldNode , "a:DataType" , nsm );
if( FieldType != null )
{
int index = FieldType.IndexOf("(");
if( index > 0 )
FieldType = FieldType.Substring( 0 , index );
}
field.FieldType = FieldType ;
field.FieldWidth = ReadXMLValue( FieldNode , "a:Length" , nsm );
if( Keys.Contains( id ))
field.PrimaryKey = true;
}
}
return RecordCount ;
}
private string ReadXMLValue(
System.Xml.XmlNode node ,
string path ,
System.Xml.XmlNamespaceManager nsm )
{
System.Xml.XmlNode node2 = node.SelectSingleNode( path , nsm );
if( node2 == null )
return null ;
else
{
if( node2 is System.Xml.XmlElement )
return ( ( System.Xml.XmlElement ) node2).InnerText ;
else
return node2.Value ;
}
}
/// <summary>
/// 从PDM数据结构定义XML文件中加载数据结构信息
/// </summary>
/// <param name="doc">XML文档对象</param>
/// <returns>加载的字段信息个数</returns>
public int LoadFromPDMXMLDocument( XmlDocument doc )
{
intFillStyle = FillStyleConst.PDM ;
int RecordCount = 0 ;
myTables.Clear();
XmlNamespaceManager nsm = new XmlNamespaceManager( doc.NameTable );
nsm.AddNamespace( "a" , "attribute" );
nsm.AddNamespace( "c" , "collection" );
nsm.AddNamespace( "o" , "object");
XmlNode RootNode = doc.SelectSingleNode("/Model/o:RootObject/c:Children/o:Model" , nsm );
if( RootNode == null )
return 0 ;
strName = ReadXMLValue( RootNode , "a:Name" , nsm );
strDescription = strName ;
// 数据表
foreach( XmlNode TableNode in RootNode.SelectNodes("c:Tables/o:Table" , nsm ))
{
TableInfo table = new TableInfo();
myTables.Add( table );
table.Name = ReadXMLValue( TableNode , "a:Code" , nsm );
table.Remark = ReadXMLValue( TableNode , "a:Name" , nsm );
string keyid = ReadXMLValue( TableNode , "c:PrimaryKey/o:Key/@Ref" , nsm );
System.Collections.Specialized.StringCollection Keys =
new System.Collections.Specialized.StringCollection();
if( keyid != null )
{
foreach( XmlNode KeyNode in TableNode.SelectNodes(
"c:Keys/o:Key[@Id = '" + keyid + "']/c:Key.Columns/o:Column/@Ref" , nsm ))
{
Keys.Add( KeyNode.Value );
}
}
foreach( XmlNode FieldNode in TableNode.SelectNodes("c:Columns/o:Column" , nsm ))
{
RecordCount ++ ;
string id = ( ( XmlElement ) FieldNode).GetAttribute("Id");
FieldInfo field = new FieldInfo();
table.Fields.Add( field );
field.Name = ReadXMLValue( FieldNode , "a:Code" , nsm );
field.Remark = ReadXMLValue( FieldNode , "a:Name" , nsm );
field.Description = ReadXMLValue( FieldNode , "a:Comment" , nsm );
string FieldType = ReadXMLValue( FieldNode , "a:DataType" , nsm );
if( FieldType != null )
{
int index = FieldType.IndexOf("(");
if( index > 0 )
FieldType = FieldType.Substring( 0 , index );
}
field.FieldType = FieldType ;
field.FieldWidth = ReadXMLValue( FieldNode , "a:Length" , nsm );
if( Keys.Contains( id ))
field.PrimaryKey = true;
}
}
return RecordCount ;
}
private string ReadXMLValue(
System.Xml.XmlNode node ,
string path ,
System.Xml.XmlNamespaceManager nsm )
{
System.Xml.XmlNode node2 = node.SelectSingleNode( path , nsm );
if( node2 == null )
return null ;
else
{
if( node2 is System.Xml.XmlElement )
return ( ( System.Xml.XmlElement ) node2).InnerText ;
else
return node2.Value ;
}
}
厦门尚微餐饮管理软件
www.sunwale.com