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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MVS2008] XML - хранение, добавление, удаление... Обращение к опр.элементу, удаление и т.д 
:(
    Опции темы
MuForum
Дата 11.3.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



Доброе время суток.
Работаю на "Microsoft Visual Studio 2008". Язык программирования C#.

# Задача: Необходимо записывать данные в структуру/объект, с дальнейшей возможностью обращения к определённому элементу, добавление элемента по определённому индексу, удаление определённого элемента по индексу.
- Для этой цели я решил выбрать '.XML'.

# Структуру данных:
Код

<Items>
  <Item a1="..." a2="..." ... an="..." />
  <Item a1="..." a2="..." ... an="..." />
  <Item a1="..." a2="..." ... an="..." />
  <Item a1="..." a2="..." ... an="..." />
  <Item a1="..." a2="..." ... an="..." />
  <Item a1="..." a2="..." ... an="..." />
  <Item a1="..." a2="..." ... an="..." />
  ...
</Items>

- Мне необходимо будет добавлять, удалять определённый индекс, например 3.
- говорю сразу, XML начал изучать только-только, так что ногами не пинать =)))


# Запись данных в .xml:
Код

XmlDocument xmldoc = new XmlDocument();
XmlElement xmlList = xmldoc.CreateElement("Items");
XmlElement sem = null;
xmldoc.AppendChild(xmlList);
int i, j;
for (i = 0; i < 10; i++)
{
    sem = xmldoc.CreateElement("Item");
    for(j = 0; j < 6; j++) sem.SetAttribute(j.ToString(), (j + 1).ToString());
    xmlList.AppendChild(sem);
}

- Чувствую, что криво, но не могу понять, как сделать нормально.
- А вот с добавление/удалением элемента по индексу вообще полная лажа...

# Удаление:
Код

XmlNodeList xmllist = g_xmldoc.SelectNodes("//Items/Item");
XmlNode tNode = xmllist[RowIndex].ParentNode;
XmlNode tParent = tNode.FirstChild;
tParent.RemoveChild(tNode);



P.S. -> В общем парни, прошу помочь, ибо сам пока не догоняю =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Rififi
Дата 11.3.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 36



Говоришь только начал изучать.. а сам XPath уже юзаешь.. :gigi:

Я так понимаю, что xml нужен для возможности сохранять состояние обьекта между запусками программы. Тогда удобнее будет работать с классами C# и далее воспользоваться предоставляемой фреймворком возможностью сериализации
Код
[Serializable]
public class Item
{
    [XmlAttribute(AttributeName = "a1")]
    public int a1;
    // Другие поля
}

public List<Item> items;

using (StreamWriter wr = new StreamWriter("items.xml"))
{
    XmlSerializer sr = new XmlSerializer(items.GetType());
    sr.Serialize(wr, items);
}


и не нужно никакого гемора с add/remove childs

Это сообщение отредактировал(а) Rififi - 11.3.2009, 19:22
PM MAIL   Вверх
MuForum
Дата 11.3.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



#2, Rififi - Не совсем, мне данные как раз сохранять не надо.
- Мне нужно просто удобный объект, где я смогу хранить данные во время работы программы, и для удобной передачи указателя на объект между классами.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Rififi
Дата 11.3.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 36



MuForum, 
если данные нужны на время работы, то тогда выбор xml странен.
преимущества такого подхода неочевидны, а запарок много.
PM MAIL   Вверх
MuForum
Дата 11.3.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



Цитата(Rififi @ 11.3.2009,  19:34)
MuForum, 
если данные нужны на время работы, то тогда выбор xml странен.
преимущества такого подхода неочевидны, а запарок много.

Что тогда посоветуешь?
- Я до этого работал с коллекциями, а именно больше всего нравилась List<>.
Код

        public List<DataFileInfo> FileList = new List<DataFileInfo>();
        public class DataFileInfo
        {
            public bool Comment = false;
            // ----
            private string[] p = new string[28];
            public string this[int index]
            {
                get
                {
                    return (index >= 0 && index < 28) ? p[index] : string.Empty;
                }
                set
                {
                    if (index >= 0 && index < 28) p[index] = value;
                }
            }
        }

- Вот такого плана, но возникают проблемы при использовании, компилятор ругается, что нужно указывать на одну и туже структуру(с одного места). Собственно именно поэтому я и думал, может выбрать какуе-то системную.
+ Проблема ещё в том, что у меня при обработки разных данных, будет разное количество параметров.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Rififi
Дата 11.3.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 36



MuForum, 
компилятор ругается, что нужно указывать на одну и туже структуру(с одного места). 
этой фразы не понял...
PM MAIL   Вверх
MuForum
Дата 11.3.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



Я пишу программу для обработки/редактирования множества файлов, с различным внутренним строением/структурой.
- Для каждого файла пишу отдельный класс, в котором находиться нужная информация для обработки, функция чтения и обработки данных и т.д.
- Выше указанный мною пример использовать не удобно из-за того, что в моей программе одновременно может быть открыто несколько окон и соответственно обрабатываться несколько файлов.
- А для передачи указателя на эту структуру, я должен указать путь к ней.
- То есть, если в классах MyClass1 и MyClass2 располагаются идентичные структуры, но при вызове функции класса MyClass2 из MyClass1 указывая структуру из MyClass1, компилятор будет гураться...
Код

Error    2    Argument '1': cannot convert from 'System.Collections.Generic.List<DataEditor.FMain.DataFileInfo>' to 'System.Collections.Generic.List<DataEditor.TFindSystem.DataFileInfo>'

- Надеюсь теперь я доступно выразился.
- Именно по этой причине мне нужна какая-то такая структура, в которой я мог при необходимости наращивать массив значений, обращаться к определённому индексу, добавлять/удалять определённый элемент по индексу. (Ну и чтобы мог с легкость передавать указатель на эту структуру без такого гемороя)


# Добавлено: Можно конечно сделать некую эмитацию.
Код

        public List<DataFileInfo> FileList = new List<DataFileInfo>();
        public class DataFileInfo
        {
            public bool Comment = false;
            public List<string> Items = new List<string>();
        }

- Но опять же, это не совсем то, чтобы хотелось...

Это сообщение отредактировал(а) MuForum - 11.3.2009, 21:41


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Magnetic
Дата 13.3.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Цитата

Error    2    Argument '1': cannot convert from 'System.Collections.Generic.List<DataEditor.FMain.DataFileInfo>' to 'System.Collections.Generic.List<DataEditor.TFindSystem.DataFileInfo>'


Может подойдет использовать список List<object> или ArrayList и сохранять в него DataEditor.FMain.DataFileInfo и DataEditor.TFindSystem.DataFileInfo?
--------------------
Dude, where's my car?
PM MAIL   Вверх
Rififi
Дата 13.3.2009, 13:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 36



MuForum, 
используй шаблоны проектирования Composite и Singleton
PM MAIL   Вверх
PashaPash
Дата 13.3.2009, 16:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



MuForum, 
То, что структуры в  FMain и в TFindSystem называются DataFileInfo, еще не значит что это одинаковые стурктуры. С точки зрения .net это два разных типа данных, как для тебя Лекарства.Свечи и Освещение.Свечи, с полями Длина и Толщина. Вынеси объявление в DataFileInfo из классов в отдельный файл - и оба класса придут к согласию.
Rififi, 0_o а без паттернов никак?


--------------------
PM MAIL WWW   Вверх
MuForum
  Дата 14.3.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



Цитата(PashaPash @ 13.3.2009,  16:22)
MuForum, 
То, что структуры в  FMain и в TFindSystem называются DataFileInfo, еще не значит что это одинаковые стурктуры. С точки зрения .net это два разных типа данных, как для тебя Лекарства.Свечи и Освещение.Свечи, с полями Длина и Толщина. Вынеси объявление в DataFileInfo из классов в отдельный файл - и оба класса придут к согласию.
Rififi, 0_o а без паттернов никак?

Так и получилось.
Вынес в отдельное место свой класс< затем инициализируй. Думал сначала делать abstract, чтобы можно было наследовать и вносить изменения, а затем посмотрел и увидел, что мне то вносить изменения и не надо, только инициализировать.


P.S. -> Парни, не могли бы вы пожалуйста подсказать макулатуру с доступными(по возможности в сопровождение с кодом) объяснением классов/интерфейсов.
- С классами вроде более-немение дружу, а вот с интерфейсам полный аут =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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