public object ReadObject(string folderPath) { if (!Directory.Exists(folderPath)) { throw new ArgumentNullException("Folder doesn't exist"); } Dictionary <string, object> instances = new Dictionary <string, object>(); QueuedObjects queuedObjects = new QueuedObjects(); return(readFolder(folderPath, RootType, instances, queuedObjects)); }
private object readFile(string filePath, Type nominatedType, Dictionary <string, object> instances, QueuedObjects queuedObjects) { string fileName = Path.GetFileNameWithoutExtension(filePath); Type detectedType = GetTypeByName(fileName); if (detectedType != null && nominatedType != null && !detectedType.IsSubclassOf(nominatedType)) { detectedType = null; } string typeName = detectedType == null ? "" : detectedType.Name; object result = null; using (FileStream streamSource = new FileStream(filePath, FileMode.Open)) { XmlReaderSettings settings = new XmlReaderSettings { NameTable = new NameTable() }; XmlNamespaceManager xmlns = new XmlNamespaceManager(settings.NameTable); xmlns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); XmlParserContext context = new XmlParserContext(null, xmlns, "", XmlSpace.Default); using (XmlReader reader = XmlReader.Create(streamSource, settings, context)) { result = ReadEntity(reader, instances, typeName, queuedObjects); } } return(result); }
private object readFolder(string folderPath, Type nominatedType, Dictionary <string, object> instances, QueuedObjects queuedObjects) { string[] files = Directory.GetFiles(folderPath, "*.xml", SearchOption.TopDirectoryOnly); if (files == null || files.Length == 0) { return(null); } object result = readFile(files[0], nominatedType, instances, queuedObjects); if (result == null) { return(null); } Type objectType = result.GetType(); foreach (string file in Directory.GetFiles(folderPath, "*.*", SearchOption.TopDirectoryOnly)) { string extension = Path.GetExtension(file); if (string.Compare(file, ".xml", true) == 0) { continue; } PropertyInfo f = GetFieldByName(objectType, Path.GetFileNameWithoutExtension(file)); if (f != null) { Type type = f.PropertyType; if (type == typeof(byte[])) { string text = File.ReadAllText(file); f.SetValue(result, Encoding.ASCII.GetBytes(text)); } else if (type == typeof(string)) { string text = File.ReadAllText(file); f.SetValue(result, text); } } } string[] directories = Directory.GetDirectories(folderPath, "*", SearchOption.TopDirectoryOnly); foreach (string directory in directories) { string directoryName = new DirectoryInfo(directory).Name; PropertyInfo f = GetFieldByName(objectType, directoryName); if (f != null) { if (IsEntityCollection(f.PropertyType)) { IEnumerable list = f.GetValue(result) as IEnumerable; Type typeCollection = list.GetType(); MethodInfo methodAdd = typeCollection.GetMethod("Add"); if (methodAdd == null) { throw new Exception("Unsupported collection type " + typeCollection.Name); } Type collectionGeneric = typeCollection.GetGenericArguments()[0]; List <object> objects = new List <object>(); string[] subDirectories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly); foreach (string subDir in subDirectories) { string[] subfiles = Directory.GetFiles(subDir, "*.xml", SearchOption.TopDirectoryOnly); if (subfiles.Length == 1) { object o = readFolder(subDir, collectionGeneric, instances, queuedObjects); if (o != null) { objects.Add(o); } } if (subfiles.Length > 1) { foreach (string subfile in subfiles) { object o = readFile(subfile, collectionGeneric, instances, queuedObjects); if (o != null) { try { methodAdd.Invoke(list, new object[] { o }); // perf!! } catch (Exception) { } } } } else { string[] subsubDirectories = Directory.GetDirectories(subDir, "*", SearchOption.TopDirectoryOnly); foreach (string subsubDir in subsubDirectories) { object o = readFolder(subsubDir, collectionGeneric, instances, queuedObjects); if (o != null) { objects.Add(o); } } } } foreach (object o in objects) { try { methodAdd.Invoke(list, new object[] { o }); // perf!! } catch (Exception) { } } } else { object o = readFolder(directory, f.PropertyType, instances, queuedObjects); if (o != null) { LoadEntityValue(result, f, o); } } } } return(result); }
private object readFolder(string folderPath, Type nominatedType, Dictionary <string, object> instances, QueuedObjects queuedObjects) { string[] files = Directory.GetFiles(folderPath, "*.xml", SearchOption.TopDirectoryOnly); if (files == null || files.Length == 0) { return(null); } if (files.Length > 1) { throw new Exception("Unexpected multiple xml files in folder " + folderPath); } string filePath = files[0]; string fileName = Path.GetFileNameWithoutExtension(filePath); Type detectedType = GetTypeByName(fileName); if (detectedType != null && nominatedType != null && !detectedType.IsSubclassOf(nominatedType)) { detectedType = null; } string typeName = detectedType == null ? "" : detectedType.Name; object result = null; using (FileStream streamSource = new FileStream(filePath, FileMode.Open)) { XmlReaderSettings settings = new XmlReaderSettings { NameTable = new NameTable() }; XmlNamespaceManager xmlns = new XmlNamespaceManager(settings.NameTable); xmlns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); XmlParserContext context = new XmlParserContext(null, xmlns, "", XmlSpace.Default); using (XmlReader reader = XmlReader.Create(streamSource, settings, context)) { result = ReadEntity(reader, instances, typeName, queuedObjects); } } foreach (string file in Directory.GetFiles(folderPath, "*.*", SearchOption.TopDirectoryOnly)) { string extension = Path.GetExtension(file); if (string.Compare(file, ".xml", true) == 0) { continue; } PropertyInfo f = GetFieldByName(detectedType == null ? nominatedType : detectedType, Path.GetFileNameWithoutExtension(file)); if (f != null) { Type type = f.PropertyType; if (type == typeof(byte[])) { string text = File.ReadAllText(file); f.SetValue(result, Encoding.ASCII.GetBytes(text)); } else if (type == typeof(string)) { string text = File.ReadAllText(file); f.SetValue(result, text); } } } string[] directories = Directory.GetDirectories(folderPath, "*", SearchOption.TopDirectoryOnly); foreach (string directory in directories) { string directoryName = new DirectoryInfo(directory).Name; PropertyInfo f = GetFieldByName(detectedType == null ? nominatedType : detectedType, directoryName); if (f != null) { if (IsEntityCollection(f.PropertyType)) { IEnumerable list = f.GetValue(result) as IEnumerable; Type typeCollection = list.GetType(); MethodInfo methodAdd = typeCollection.GetMethod("Add"); if (methodAdd == null) { throw new Exception("Unsupported collection type " + typeCollection.Name); } Type collectionGeneric = typeCollection.GetGenericArguments()[0]; List <object> objects = new List <object>(); string[] subDirectories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly); foreach (string subDir in subDirectories) { string[] subfiles = Directory.GetFiles(subDir, "*.xml", SearchOption.TopDirectoryOnly); if (subfiles.Length > 0) { object o = readFolder(subDir, collectionGeneric, instances, queuedObjects); if (o != null) { objects.Add(o); } } else { string[] subsubDirectories = Directory.GetDirectories(subDir, "*", SearchOption.TopDirectoryOnly); foreach (string subsubDir in subsubDirectories) { object o = readFolder(subsubDir, collectionGeneric, instances, queuedObjects); if (o != null) { objects.Add(o); } } } } foreach (object o in objects) { try { methodAdd.Invoke(list, new object[] { o }); // perf!! } catch (Exception) { } } } else { object o = readFolder(directory, f.PropertyType, instances, queuedObjects); if (o != null) { LoadEntityValue(result, f, o); } } } } return(result); }