Пример #1
0
        /// <summary>
        /// 创建配置节
        /// </summary>
        /// <param name="parent">父配置节</param>
        /// <param name="xmlNode">XML节</param>
        /// <param name="readonly">是否只读</param>
        /// <param name="searchPath">XML搜索目录列表</param>
        /// <param name="configFiles">如果有子配置文件,则添加到此列表</param>
        internal static XmlConfigSetting Create(XmlConfigSetting parent, XmlNode xmlNode, bool @readonly, string[] searchPath, List<string> configFiles)
        {
            if(xmlNode.NodeType != XmlNodeType.Element) {
                throw new ConfigException("解析到非法元素");
            }

            if(searchPath == null || searchPath.Length <= 0) {
                searchPath = ConfigHelper.ConfigFileDefaultSearchPath;
            }
            var setting = new XmlConfigSetting {
                parent = parent,
                ReadOnly = @readonly,
                property = new XmlSettingProperty(xmlNode, @readonly),
                childSettings = new ConfigSettingCollection(true),
                operatorSettings = new ConfigSettingCollection(false),
                value = new XmlSettingValue(xmlNode, @readonly)
            };
            setting.SettingName = setting.Name;
            var settingOperator = setting.SettingOperator;
            if (settingOperator != 0 && settingOperator != ConfigSettingOperator.Clear) {
                var operatorKey = setting.ConfigOperatorKey;
                var newName = setting.Property.TryGetPropertyValue(operatorKey);
                if(string.IsNullOrEmpty(newName) && !setting.ConfigKeyNullable) {
                    throw new ConfigException("配置命令未定义属性:" + operatorKey);
                }
                setting.value.SetName(newName);
            }

            foreach(XmlNode node in xmlNode.ChildNodes) {
                if(node.NodeType != XmlNodeType.Element) {
                    continue;
                }
                var childSetting = Create(setting, node, @readonly, searchPath, configFiles);
                setting.operatorSettings.Add(childSetting);
            }
            Compile(setting, setting.operatorSettings);

            var sourceDone = false;
            CheckConfigProvider(setting, ref sourceDone);

            var configFile = setting.ConfigFile;
            var configNode = setting.ConfigNode;
            if(!sourceDone && !string.IsNullOrEmpty(configFile)) {
                configFile = ConfigHelper.SearchConfigFile(configFile, searchPath);
                if(!string.IsNullOrEmpty(configFile)) {
                    if(string.IsNullOrEmpty(configNode)) {
                        configNode = "/";
                    }
                    var newNode = ConfigHelper.LoadXmlNodeFromFile(configFile, configNode, false);
                    if(newNode != null) {
                        if(configFiles != null) {
                            configFiles.Add(configFile);
                        }
                        setting.Merge(Create(parent, newNode, @readonly, searchPath, configFiles));
                    }
                }
            }
            return setting;
        }
Пример #2
0
        /// <summary>
        /// �������ý�
        /// </summary>
        /// <param name="parent">�����ý�</param>
        /// <param name="xmlNode">XML��</param>
        /// <param name="readonly">�Ƿ�ֻ��</param>
        /// <param name="searchPath">XML����Ŀ¼�б�</param>
        /// <param name="configFiles">������������ļ�������ӵ����б�</param>
        internal static XmlConfigSetting Create(XmlConfigSetting parent, XmlNode xmlNode, bool @readonly, string[] searchPath, List<string> configFiles)
        {
            if(xmlNode.NodeType != XmlNodeType.Element) {
                throw new ConfigException("�������Ƿ�Ԫ��");
            }

            if(searchPath == null || searchPath.Length <= 0) {
                searchPath = ConfigHelper.ConfigFileDefaultSearchPath;
            }
            XmlConfigSetting setting = new XmlConfigSetting();
            setting.parent = parent;
            setting.ReadOnly = @readonly;
            setting.property = new XmlSettingProperty(xmlNode, @readonly);
            setting.childSettings = new ConfigSettingCollection(true);
            setting.operatorSettings = new ConfigSettingCollection(false);
            setting.value = new XmlSettingValue(xmlNode, @readonly);
            setting.SettingName = setting.Name;
            ConfigSettingOperator settingOperator = setting.SettingOperator;
            if (settingOperator != 0 && settingOperator != ConfigSettingOperator.Clear) {
                string newName = setting.Property.TryGetPropertyValue(ConfigNamePropertyName);
                if(string.IsNullOrEmpty(newName)) {
                    throw new ConfigException("��������δ�������ԣ�" + ConfigNamePropertyName);
                }
                setting.value.SetName(newName);
            }

            foreach(XmlNode node in xmlNode.ChildNodes) {
                if(node.NodeType != XmlNodeType.Element) {
                    continue;
                }
                XmlConfigSetting childSetting = Create(setting, node, @readonly, searchPath, configFiles);
                setting.operatorSettings.Add(childSetting);
            }
            Compile(setting, setting.operatorSettings);

            string configFile = setting.ConfigFile;
            string configNode = setting.ConfigNode;
            if(!string.IsNullOrEmpty(configFile)) {
                configFile = ConfigHelper.SearchConfigFile(configFile, searchPath);
                if(!string.IsNullOrEmpty(configFile)) {
                    if(string.IsNullOrEmpty(configNode)) {
                        configNode = "/";
                    }
                    XmlNode newNode = ConfigHelper.LoadXmlNodeFromFile(configFile, configNode, false);
                    if(newNode != null) {
                        if(configFiles != null) {
                            configFiles.Add(configFile);
                        }
                        setting.Merge(Create(parent, newNode, @readonly, searchPath, configFiles));
                    }
                }
            }
            return setting;
        }
Пример #3
0
        /// <summary>
        /// 创建配置节
        /// </summary>
        /// <param name="parent">父配置节</param>
        /// <param name="xmlNode">XML节</param>
        /// <param name="readonly">是否只读</param>
        /// <param name="searchPath">XML搜索目录列表</param>
        /// <param name="configFiles">如果有子配置文件,则添加到此列表</param>
        internal static XmlConfigSetting Create(XmlConfigSetting parent, XmlNode xmlNode, bool @readonly, string[] searchPath, List <string> configFiles)
        {
            if (xmlNode.NodeType != XmlNodeType.Element)
            {
                throw new ConfigException("解析到非法元素");
            }

            if (searchPath == null || searchPath.Length <= 0)
            {
                searchPath = ConfigHelper.ConfigFileDefaultSearchPath;
            }
            var setting = new XmlConfigSetting {
                parent           = parent,
                ReadOnly         = @readonly,
                property         = new XmlSettingProperty(xmlNode, @readonly),
                childSettings    = new ConfigSettingCollection(true),
                operatorSettings = new ConfigSettingCollection(false),
                value            = new XmlSettingValue(xmlNode, @readonly)
            };

            setting.SettingName = setting.Name;
            var settingOperator = setting.SettingOperator;

            if (settingOperator != 0 && settingOperator != ConfigSettingOperator.Clear)
            {
                var operatorKey = setting.ConfigOperatorKey;
                var newName     = setting.Property.TryGetPropertyValue(operatorKey);
                if (string.IsNullOrEmpty(newName) && !setting.ConfigKeyNullable)
                {
                    throw new ConfigException("配置命令未定义属性:" + operatorKey);
                }
                setting.value.SetName(newName);
            }

            foreach (XmlNode node in xmlNode.ChildNodes)
            {
                if (node.NodeType != XmlNodeType.Element)
                {
                    continue;
                }
                var childSetting = Create(setting, node, @readonly, searchPath, configFiles);
                setting.operatorSettings.Add(childSetting);
            }
            Compile(setting, setting.operatorSettings);

            var sourceDone = false;

            CheckConfigProvider(setting, ref sourceDone);

            var configFile = setting.ConfigFile;
            var configNode = setting.ConfigNode;

            if (!sourceDone && !string.IsNullOrEmpty(configFile))
            {
                configFile = ConfigHelper.SearchConfigFile(configFile, searchPath);
                if (!string.IsNullOrEmpty(configFile))
                {
                    if (string.IsNullOrEmpty(configNode))
                    {
                        configNode = "/";
                    }
                    var newNode = ConfigHelper.LoadXmlNodeFromFile(configFile, configNode, false);
                    if (newNode != null)
                    {
                        if (configFiles != null)
                        {
                            configFiles.Add(configFile);
                        }
                        setting.Merge(Create(parent, newNode, @readonly, searchPath, configFiles));
                    }
                }
            }
            return(setting);
        }