📄 schemaparser.cs
字号:
//Author contact: Thanh.Dao@gmx.net
using System;
using System.Collections;
using System.Reflection;
using System.Threading;
using System.Web.Services.Description;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace Kofax.WFD.UI.SchemaHelper
{
#region Denote Prefix for long schem name
//Denote prefix for long name data type
//Simply later by I2
using QName = XmlQualifiedName;
using Form = XmlSchemaForm;
using Use = XmlSchemaUse;
using SOM=XmlSchema;
using SOMList = XmlSchemaObjectCollection;
using SOMObject = XmlSchemaObject;
using Element = XmlSchemaElement;
using Attr = XmlSchemaAttribute;
using AttrGroup = XmlSchemaAttributeGroup;
using AttrGroupRef = XmlSchemaAttributeGroupRef;
using SimpleType = XmlSchemaSimpleType;
using ComplexType = XmlSchemaComplexType;
using SimpleModel = XmlSchemaSimpleContent;
using SimpleExt = XmlSchemaSimpleContentExtension;
using SimpleRst = XmlSchemaSimpleContentRestriction;
using ComplexModel = XmlSchemaComplexContent;
using ComplexExt = XmlSchemaComplexContentExtension;
using ComplexRst = XmlSchemaComplexContentRestriction;
using SimpleTypeRst = XmlSchemaSimpleTypeRestriction;
using SimpleTypeModel = XmlSchemaSimpleTypeContent;
using SimpleList = XmlSchemaSimpleTypeList;
using SimpleUnion = XmlSchemaSimpleTypeUnion;
using SchemaFacet = XmlSchemaFacet;
using EnumerationFacet = XmlSchemaEnumerationFacet;
using MinExcludesiveFacet=XmlSchemaMinExclusiveFacet ;
using LengthFacet = XmlSchemaLengthFacet;
using MinLengthFacet = XmlSchemaMinLengthFacet;
using PatternFacet = XmlSchemaPatternFacet;
using Particle = XmlSchemaParticle;
using Sequence = XmlSchemaSequence;
using Choice = XmlSchemaChoice;
using Annotation=XmlSchemaAnnotation;
using Documentation=XmlSchemaDocumentation;
using AnyAttribute=XmlSchemaAnyAttribute;
using AnyElement=XmlSchemaAny;
using GroupRef=XmlSchemaGroupRef;
using Group=XmlSchemaGroup;
using All=XmlSchemaAll ;
using Include=XmlSchemaInclude;
#endregion
/// <summary>
/// Summary description for SchemaParser.
/// </summary>
public class SchemaParser
{
public class NodeData
{
public XmlQualifiedName Name;
public string Type;
public string Namespace;
public bool Qualified;
public string Description = string.Empty;
public XmlSchemaObject baseObj;
public bool MultiValue=false;
public bool Nullable=false;
public string Value=string.Empty;
public string ObjectType=string.Empty;
public NodeData (XmlSchemaObject obj, XmlQualifiedName name, string type, string desc, string defaultValue)
{
baseObj=obj;
Name=name;
Type=type;
Namespace=name.Namespace;
Description=desc;
ObjectType=obj.GetType().ToString() ;
}
}
XmlSchemas _schemas;
public static int TimeOver=2000;
private static readonly XmlQualifiedName arrayType=new XmlQualifiedName ("Array","http://schemas.xmlsoap.org/soap/encoding/");
private static readonly XmlQualifiedName arrayTypeRefName=new XmlQualifiedName ("arrayType","http://schemas.xmlsoap.org/soap/encoding/");
XmlSchemaElement _anyElement;
public SoapBindingUse BindingUse=SoapBindingUse.Literal;
ArrayList _queue;
class Encoded
{
public string Namespace;
public XmlSchemaElement Element;
public Encoded (string ns, XmlSchemaElement elem)
{ Namespace=ns; Element=elem; }
}
void MyInit()
{
_anyElement=new XmlSchemaElement ();
_anyElement.Name="any";
_anyElement.SchemaTypeName=new XmlQualifiedName ("anyType",XmlSchema.Namespace);
_queue=new ArrayList ();
}
public SchemaParser (XmlSchemas schemas)
{
MyInit ();
this._schemas=schemas;
Do_PrefixTagging();
}
public TreeNode Translate (XmlQualifiedName qname)
{
processHasExited=false;
_node=new TreeNode() ;
_node.ImageIndex = 17;
_node.SelectedImageIndex = 17;
_qname=qname;
_lookupType=null;
StartParsing();
//Run_Thread ()
return _node;
}
public TreeNode Translate (XmlQualifiedName qname, XmlSchemaObject obj)
{
processHasExited=false;
_node=new TreeNode() ;
_node.ImageIndex = 17;
_node.SelectedImageIndex = 17;
_qname=qname;
_lookupType=obj.GetType();
StartParsing();
//Run_Thread ()
return _node;
}
void Run_Thread()
{
ThreadStart threadStart = new ThreadStart(StartParsing);
Thread thread = new Thread(threadStart);
thread.Start();
thread.Join(TimeOver);
}
XmlSerializerNamespaces _namespaces=new XmlSerializerNamespaces() ;
void Do_PrefixTagging()
{
_namespaces=new XmlSerializerNamespaces();
for(int i=0; i < _schemas.Count; i++)
{
XmlSchema schema=_schemas[i];
if (schema.TargetNamespace != string.Empty && NamespaceHandler.LoopupPrefix(_namespaces, schema.TargetNamespace) == string.Empty)
{
_namespaces.Add("m" + i, schema.TargetNamespace) ;
}
}
for(int i=0; i < _schemas.Count; i++)
{
XmlSchema schema=_schemas[i];
XmlQualifiedName[] XmlQualifiedNameList=schema.Namespaces.ToArray();
XmlSerializerNamespaces xmlns=new XmlSerializerNamespaces() ;
int j=0;
foreach (XmlQualifiedName qname in XmlQualifiedNameList )
{
//if (XmlQualifiedName.Name == string.Empty )
{
++j;
if (qname.Namespace == schema.TargetNamespace)
{
string prefix=NamespaceHandler.LoopupPrefix(_namespaces, schema.TargetNamespace);
if (prefix != string.Empty)
{
xmlns.Add(prefix, qname.Namespace) ;
}
else
{
xmlns.Add("tns", qname.Namespace) ;
}
}
else
{
string prefix=NamespaceHandler.LoopupPrefix(_namespaces, schema.TargetNamespace);
if (prefix != string.Empty)
{
xmlns.Add(prefix, qname.Namespace) ;
}
else
{
xmlns.Add("ns"+j, qname.Namespace) ;
}
}
}
}
schema.Namespaces = xmlns ;
}
}
XmlQualifiedName _qname;
TreeNode _node;
Type _lookupType;
bool processHasExited=false;
void StartParsing()
{
try
{
processHasExited=false;
object lookup=null;
if (_lookupType == null)
lookup=_schemas.Find(_qname, typeof(XmlSchemaElement)) ;
else
lookup=_schemas.Find(_qname, _lookupType) ;
if (lookup is XmlSchemaElement)
Create_RootElement (_node, _qname);
else
Create_CustomType (_node, _qname);
processHasExited=true;
}
catch(Exception e)
{
throw e;
}
}
void Create_RootElement (TreeNode inner, XmlQualifiedName qname)
{
XmlSchemaElement elem=(XmlSchemaElement) _schemas.Find (qname, typeof(XmlSchemaElement));
if (elem == null) throw new Exception ("Element not found: " + qname);
Add_Element (inner, qname.Namespace, elem);
}
string GetAnnotation(Annotation annot)
{
if (annot == null) return "";
string annotation=string.Empty;
foreach (XmlSchemaObject obj in annot.Items )
{
XmlSchemaDocumentation doc=obj as XmlSchemaDocumentation ;
XmlSchemaAppInfo app=obj as XmlSchemaAppInfo ;
if (doc != null)
annotation +=GetDocumentContent( doc.Markup) ;
if (app != null)
annotation +=GetDocumentContent( app.Markup) ;
}
return annotation;
}
string GetDocumentContent(XmlNode[] nodes)
{
string strContent = "";
foreach (XmlNode node in nodes)
{
strContent = strContent + node.InnerText.Trim() + Environment.NewLine;
}
return strContent;
}
bool IsInfiniteRecursiveLoop(TreeNode parent, XmlQualifiedName qname)
{
if (qname.IsEmpty) return false;
TreeNode ancestor=parent;
int count=0;
while (ancestor != null)
{
if (ancestor.Tag != null && ancestor.Tag is NodeData)
{
XmlQualifiedName aqname=((NodeData) ancestor.Tag).Name ;
if (aqname.Equals(qname) )
++count;
}
ancestor=ancestor.Parent;
}
return count > 1;
}
XmlSchema GetSchemaByName(string targetNamespace)
{
for(int i=0; i < _schemas.Count; i++)
if (_schemas[i].TargetNamespace == targetNamespace)
{
return _schemas[i];
}
return null;
}
void Add_Element (TreeNode complexNode, string ns, XmlSchemaElement elem)
{
//add to complexNode
XmlQualifiedName nodeName=XmlQualifiedName.Empty;
if (!elem.RefName.IsEmpty)
{
XmlSchemaElement refElem=GetRefElement (elem);
if (refElem == null) throw new Exception ("Global element not found: " + elem.RefName);
nodeName=elem.RefName;
elem=refElem;
}
else
{
nodeName=elem.QualifiedName;
}
if (IsInfiniteRecursiveLoop (complexNode, nodeName)) return;
TreeNode elemNode=new TreeNode(nodeName.Name) ;
elemNode.ImageIndex=1;
elemNode.SelectedImageIndex = 1;
if (nodeName.Namespace != string.Empty)
{
elemNode.Text=NamespaceHandler.LoopupPrefix(_namespaces, nodeName.Namespace ) + ":" + nodeName.Name ;
}
elemNode.Tag=nodeName;
complexNode.Nodes.Add(elemNode) ;
string desc = GetAnnotation(elem.Annotation);
NodeData data=new NodeData(elem, nodeName, "", desc, elem.DefaultValue) ;
elemNode.Tag=data;
if (!elem.SchemaTypeName.IsEmpty)
{
XmlSchemaComplexType ct=GetComplexTypeByName (elem.SchemaTypeName);
if (ct != null)
{
data.Type=ct.QualifiedName.Name;
Parse_ComplexType (elemNode, ct, nodeName);
}
else
if (!elem.SchemaTypeName.IsEmpty)
{
data.Type=GetBuiltInTypeName (elem.SchemaTypeName);
string test="";
if (BindingUse == SoapBindingUse.Encoded)
test="type" + GetQualifiedNameString (complexNode, elem.SchemaTypeName)
+( (GetBuiltInTypeName (elem.SchemaTypeName)));
}
}
else if (elem.SchemaType == null)
{
data.Type="any";
}
else
{
if (elem.SchemaType is XmlSchemaComplexType)
Parse_ComplexType (elemNode, (XmlSchemaComplexType) elem.SchemaType, nodeName);
else
if (elem.SchemaType is XmlSchemaSimpleType)
{
XmlSchemaSimpleType st=elem.SchemaType as XmlSchemaSimpleType;
data.Type=GetBuiltInTypeName (st.QualifiedName );
}
}
}
void Create_CustomType (TreeNode inner, XmlQualifiedName qname)
{
XmlSchemaComplexType ctype=GetComplexTypeByName (qname);
TreeNode node=new TreeNode() ;
inner.Nodes.Add(node) ;
node.Text=qname.Name;
if (ctype != null)
{
node.ImageIndex = 3;
node.SelectedImageIndex = 3;
Parse_ComplexType (node, ctype, qname);
return;
}
XmlSchemaSimpleType stype=(XmlSchemaSimpleType) _schemas.Find (qname, typeof(XmlSchemaSimpleType));
if (stype != null)
{
node.ImageIndex = 2;
node.SelectedImageIndex = 2;
Parse_SimpleType (node, stype);
return;
}
inner.Tag=((GetBuiltInTypeName (qname)));
throw new Exception ("Type not found: " + qname);
}
void Parse_ComplexType (TreeNode inner, XmlSchemaComplexType stype, XmlQualifiedName rootName)
{
Parse_ComplexType (inner, stype, rootName, -1);
}
void Parse_ComplexType (TreeNode innerNode, XmlSchemaComplexType stype, XmlQualifiedName rootName, int id)
{
string ns=rootName.Namespace;
if (rootName.Name.IndexOf ("[]") != -1) rootName=arrayType;
if (BindingUse == SoapBindingUse.Encoded)
{
innerNode.Text=NamespaceHandler.LoopupPrefix(_namespaces, rootName.Namespace ) + ":" + rootName.Name ;
//innerNode.Text = rootName.Namespace + ":" + rootName.Name;
ns=string.Empty;
}
else
{
if (rootName.Namespace != string.Empty)
innerNode.Text=NamespaceHandler.LoopupPrefix(_namespaces, rootName.Namespace ) + ":" + rootName.Name ;
else
innerNode.Text=rootName.Name;
}
if (innerNode.Tag == null)
{
string desc = GetAnnotation(stype.Annotation);
NodeData data=new NodeData(stype, rootName, "", desc , string.Empty) ;
innerNode.Tag=data;
}
if (id != -1)
{
TreeNode node=new TreeNode("id:" + id) ;
innerNode.Nodes.Add(node) ;
if (rootName != arrayType)
{
TreeNode node2=new TreeNode("Type" + GetQualifiedNameString (innerNode, rootName)) ;
node.Nodes.Add(node2) ;
}
}
Add_ComplexAttributes (innerNode, stype);
Add_ComplexElements (innerNode, ns, stype);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -