Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ini файл на XML 
:(
    Опции темы
HalkaR
Дата 5.3.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 14
Всего: 42



Вот для работы написал класс для работы с ini-файлом. Посмотрите плиз - как можно оптимизировать? Если кому пригодится тоже можите брать.
Код
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;

namespace XMLINI
{
    static class XMLIniFile
    {
        static string filename = "data.xml";
        static string sAppPath = Directory.GetCurrentDirectory();
        /// <summary>
        /// Записывает даные в узел
        /// </summary>
        /// <param name="nodeName">Имя узла для записи</param>        
        /// <param name="paramName">Параметр для записи</param>        
        /// <param name="paramVal">Данные для записи</param>        
        public static bool WriteData(string nodeName, string paramName, string paramVal)
        {
            // создаем новый XML документ
            XmlDocument xDoc = new XmlDocument();
            try
            {
                // пытаемся загрузить
                xDoc.Load(Path.Combine(sAppPath, filename));
            }
            catch
            {
                // если не получилось создаем новый
                XmlDeclaration xmlDeclaration = xDoc.CreateXmlDeclaration("1.0", "utf-8", null);
                xDoc.InsertBefore(xmlDeclaration, xDoc.DocumentElement);
            }

            // список узлов
            XmlNodeList fileNodes = xDoc.GetElementsByTagName("file");
            XmlNode newParentElem = null;
            // исчем подходящий узел для записи
            foreach (XmlNode xNode in fileNodes)
            {
                if (xNode.Attributes[0].Value == nodeName)
                {
                    newParentElem = xNode;
                }
            }

            // если нашли записываем
            if (newParentElem != null)
            {
                bool found = false;
                // исчем параметр для записи
                foreach (XmlNode xChildNode in newParentElem.ChildNodes)
                {
                    if (xChildNode.Name == paramName)
                    {
                        // если нашли - записываем
                        xChildNode.InnerText = paramVal;
                        found = true;
                    }
                }
                // не нашли - создаем
                if (!found)
                {
                    XmlNode newChildElem = xDoc.CreateNode("element", paramName, "");
                    newChildElem.InnerText = paramVal;
                    newParentElem.AppendChild(newChildElem);
                }
            }
            else
            {
                // если не нашли узел - все создаем
                newParentElem = xDoc.CreateNode("element", "file", "");
                XmlAttribute newAttr = xDoc.CreateAttribute("filename");
                newAttr.Value = nodeName;
                newParentElem.Attributes.Append(newAttr);

                XmlNode newChildElem = xDoc.CreateNode("element", paramName, "");
                newChildElem.InnerText = paramVal;
                newParentElem.AppendChild(newChildElem);

                try
                {
                    // ищем корневой узел
                    XmlNodeList rootNode = xDoc.GetElementsByTagName("root");
                    rootNode[0].AppendChild(newParentElem);
                }
                catch
                {
                    // если не нашли - создаем
                    XmlElement rootNode = xDoc.CreateElement("root");
                    rootNode.AppendChild(newParentElem);
                    xDoc.AppendChild(rootNode);
                }
            }

            try
            {
                // сохраниям
                xDoc.Save(Path.Combine(sAppPath, filename));
                return true;
            }
            catch
            {
                return false;
            }
            
        }
        /// <summary>
        /// Считывает данные из узла
        /// </summary>
        /// <param name="nodeName">Имя узла для чтения</param>        
        /// <param name="paramName">Параметр для чтения</param>        
        /// <param name="paramVal">Данные для чтения</param>
        public static bool ReadData(string nodeName, string paramName, ref string paramVal)
        {
            // создаем документ
            XmlDocument xDoc = new XmlDocument();
            try
            {
                // читаем
                xDoc.Load(Path.Combine(sAppPath, filename));
            }
            catch
            {
                // если не получилось - уходим
                return false;
            }

            //список узлов
            XmlNodeList fileNodes = xDoc.GetElementsByTagName("file");
            XmlNode newParentElem = null;
            // исчем подходящий
            foreach (XmlNode xNode in fileNodes)
            {
                if (xNode.Attributes[0].Value == nodeName)
                {
                    newParentElem = xNode;
                }
            }
            // исчем нужный параметр
            if (newParentElem != null)
            {
                foreach (XmlNode xChildNode in newParentElem.ChildNodes)
                {
                    if (xChildNode.Name == paramName)
                    {
                        // нашли - читаем
                        paramVal = xChildNode.InnerText;

                        return true;
                    }
                }
            }            
            return false;
        }
    }
}




Это сообщение отредактировал(а) HalkaR - 5.3.2006, 13:12
PM MAIL   Вверх
Ch0bits
Дата 5.3.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: 9
Всего: 62



Я обычно настройки храню в структуре и при запуске/выгрузке программы делаю сериализацию/десериализацию.

Посмотрел... работает, только по моему лучше было бы сделать динамический класс с конструктором, а то как-то непривычно выглядит.

Это сообщение отредактировал(а) Ch0bits - 5.3.2006, 14:24
PM WWW   Вверх
HalkaR
Дата 5.3.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 14
Всего: 42



Ch0bits, тут просто эти данные постоянно меняются и их надо писать и перечитывать, для работы нескольких программ на разных языках одновременно.
PM MAIL   Вверх
arilou
Дата 6.3.2006, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



HalkaR, сразу приходит мысль о том, что такой класс - это низкий уровень для чего-либо более конкретного. В нем есть основная проблема - это использование текстовых имен.

Я имею ввиду, что если у тебя есть такой код:

Код

WriteData("nodeName", "paramName", "value")


то он порождает потенциальную проблему - валидация (string nodeName, string paramName, string paramVal) происходит только в рантайме. И если ты (или пользователь твоего класса) ошибся в написании имени параметра, то узнает об этом он поздно smile

Вот в варианте Ch0bits'а такой проблемы нет - поскольку в его программе используется класс конфигурации, который сериализуется стандартными ср-вами. Поэтому если он ошибется в написании параметра, то узнает об этом в момент компиляции, что сэкономит кучу времени.


P.S.
Цитата

(string nodeName, string paramName, string paramVal)


вот если бы было

(string nodeName, string paramName, object paramVal)


DISCLAIMER: Все вышеуказанное - мое личное мнение, сформированное на основе опыта.

Это сообщение отредактировал(а) arilou - 6.3.2006, 11:00


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Exception
Дата 6.3.2006, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186




[offtop]
Вроде как DISCLAIMER smile
[/offtop]

PM   Вверх
arilou
Дата 6.3.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Exception, спсб


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 6.3.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



З.Ы. это всё конечно хорошо, и плюс HalkaR-у за решение задачи, но ведь есть уже готовые решения... ну к примеру тот же AMS.Profile умеет читать/сохранять не только в INI и XML, но и в реестр, и в .config-файл - на всё один и тот же интерфейс IProfile, оч. удобно... рекомендую...


--------------------
user posted image
PM MAIL WWW   Вверх
HalkaR
Дата 6.3.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 14
Всего: 42



Цитата(arilou @ 6.3.2006, 01:42 Найти цитируемый пост)
P.S.
Цитата

(string nodeName, string paramName, string paramVal)


вот если бы было

(string nodeName, string paramName, object paramVal)
Можно и так - исправлю.
Цитата(arilou @ 6.3.2006, 01:42 Найти цитируемый пост)
И если ты (или пользователь твоего класса) ошибся в написании имени параметра, то узнает об этом он поздно smile
Да, этот момент есть, но у меня несколько разных парметров и в одном месте используются одни - в другом другие. Причем в процессе разработки они могут меняться, и мне удобнее иметь возможность добавлять любой параметр без сильного изменения кода.
Цитата(mr.DUDA @ 6.3.2006, 12:56 Найти цитируемый пост)
З.Ы. это всё конечно хорошо, и плюс HalkaR-у за решение задачи, но ведь есть уже готовые решения... ну к примеру тот же AMS.Profile умеет читать/сохранять не только в INI и XML, но и в реестр, и в .config-файл - на всё один и тот же интерфейс IProfile, оч. удобно... рекомендую...
За плюс спасибо smile)) Но я решал конкретную свою проблему - быстро писать/читать любые параметры для записи, для меня была важнее скорость чем широта возможностей (поэтому собственно сюда и написал - послушать рекомендации, но если кому пригодиться тож хорошо).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1824 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.