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