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)); }