GeometryGym.Ifc.BaseClassIfc.ParseXml C# (CSharp) Méthode

ParseXml() private méthode

private ParseXml ( XmlElement xml ) : void
xml System.Xml.XmlElement
Résultat void
        internal virtual void ParseXml(XmlElement xml)
        {
        }

Usage Example

Exemple #1
0
        internal T ParseXml <T>(XmlElement xml) where T : IBaseClassIfc
        {
            if (xml == null)
            {
                return(default(T));
            }
            if (xml.HasAttribute("ref"))
            {
                string str = xml.Attributes["ref"].Value;
                if (mParsed.ContainsKey(str))
                {
                    return((T)(IBaseClassIfc)mParsed[str]);
                }
                if (xml.HasAttribute("xsi:nil"))
                {
                    string query = string.Format("//*[@id='{0}']", str);
                    xml = (XmlElement)xml.OwnerDocument.SelectSingleNode(query);
                    if (xml == null)
                    {
                        return(default(T));
                    }
                }
            }
            else if (xml.HasAttribute("href"))
            {
                string str = xml.Attributes["href"].Value;
                if (mParsed.ContainsKey(str))
                {
                    return((T)(IBaseClassIfc)mParsed[str]);
                }
                if (xml.HasAttribute("xsi:nil"))
                {
                    string query = string.Format("//*[@id='{0}']", str);                     // or "//book[@id='{0}']"
                    xml = (XmlElement)xml.OwnerDocument.SelectSingleNode(query);
                    if (xml == null)
                    {
                        return(default(T));
                    }
                }
            }
            string id = (xml.HasAttribute("id") ? xml.Attributes["id"].Value : "");

            if (!string.IsNullOrEmpty(id) && mParsed.ContainsKey(id))
            {
                return((T)(IBaseClassIfc)mParsed[id]);
            }

            string keyword = xml.HasAttribute("xsi:type") ? xml.Attributes["xsi:type"].Value : xml.Name;
            Type   type    = Type.GetType("GeometryGym.Ifc." + keyword, false, true);

            if (type == null)
            {
                type = typeof(T);
            }
            if (type.IsAbstract)
            {
                IEnumerable <Type> types = type.Assembly.GetTypes().Where(x => x != type && type.IsAssignableFrom(x));
                if (types != null && types.Count() == 1)
                {
                    type = types.First();
                }
            }
            ConstructorInfo constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
                                                              null, Type.EmptyTypes, null);

            if (constructor != null)
            {
                BaseClassIfc entity = constructor.Invoke(new object[] { }) as BaseClassIfc;
                if (entity != null)
                {
                    int index = NextBlank;
                    if (!string.IsNullOrEmpty(id))
                    {
                        int i = 0;
                        if (id[0] == 'i')
                        {
                            if (int.TryParse(id.Substring(1), out i))
                            {
                                if (this[i] == null)
                                {
                                    index = i;
                                }
                            }
                        }
                    }
                    this[index] = entity;
                    entity.ParseXml(xml);
                    if (xml.HasAttribute("id"))
                    {
                        string str = xml.Attributes["id"].Value;
                        if (!mParsed.ContainsKey(str))
                        {
                            mParsed.Add(str, entity);
                        }
                    }
                    return((T)(IBaseClassIfc)entity);
                }
            }

            if (xml.HasChildNodes && xml.ChildNodes.Count == 1)
            {
                return(ParseXml <T>(xml.ChildNodes[0] as XmlElement));
            }
            return(default(T));
        }