예제 #1
0
        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));
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }