Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Записать XML-файл  (Прочитано 38288 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Gor
Постоялец

ru
Offline Offline

« : 18-07-2011 17:57 » 

Привет!

Есть XML-файл:

Код: (XML)
<?xml version="1.0" encoding="windows-1251"?>
<Q-144>
        <Соединение1>
                <Елемент1>ааа</Елемент1>
                <Отношение>ббб</Отношение>
                <Елемент2 Число="10">ввв</Елемент2>
        </Соединение1>
</Q-144>

Как добавить к нему тег <Соединение2>, т.е. должно получиться:

Код: (XML)
<?xml version="1.0" encoding="windows-1251"?>
<Q-144>
        <Соединение1>
                <Елемент1>ааа</Елемент1>
                <Отношение>ббб</Отношение>
                <Елемент2 Число="10">ввв</Елемент2>
        </Соединение1>
        <Соединение2>
                <Елемент1>ггг</Елемент1>
                <Отношение Число="50">ддд</Отношение>
                <Елемент2>еее</Елемент2>
        </Соединение2>

</Q-144>

У меня перезатирается <Соединение1>… на его месте <Соединение2>.

Спасибо.

P.S. Работаю в Visual C# 2008.
« Последнее редактирование: 18-07-2011 18:06 от Gor » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-07-2011 18:21 » 

См. XmlNode.AppendChild
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 18-07-2011 18:21 » 

Дык, а где код, который добавляет? Или ты Студию как текстовый редактор используешь? Тогда вобще ничего не понятно?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 18-07-2011 19:04 » 

Кстати по стандарту XML желательно использовать кодировку UTF-8, Хотя в принципе никто не запрешает и другие кодировки. Да и имена тегов лучше латиницей писать. Неизвестно, может быть вашим творением и в других странах заинтересуются.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 18-07-2011 20:01 » 

Я бы сказал, что по стандарту в первую очередь, поскольку речь идёт о списке, надо позаботиться о DTD. Как это будет выглядеть? <Соединение1> <Соединение2>  <Соединение3> ... <СоединениеN>?

Я бы сделал так:

<Соединение номер="1"> <Соединение номер="2"> и тд

Это же относится и к содержимому тэга.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #5 : 19-07-2011 10:08 » 

Сбрасываю свой «гениальный» код:

Код: (C#)
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
    string[] spisok_num_soed =  { "Соединение1", "Соединение2", "Соединение3", "Соединение4",
                                  "Соединение5", "Соединение6", "Соединение7", "Соединение8",  
                                  "Соединение9", "Соединение10", "Соединение11", "Соединение12"};
               
   XmlDocument doc = new XmlDocument();
   doc.Load("ОЭС.xml");
   XmlNode root = doc.DocumentElement;

   XmlTextWriter xw = new XmlTextWriter("ОЭС.xml", Encoding.GetEncoding(1251));
   xw.WriteStartDocument();  //заголовок XML
   xw.Formatting = Formatting.Indented;
   xw.IndentChar = '\t';
   xw.Indentation = 2;
   xw.WriteStartElement("Q-144");
               
   foreach (XmlNode childnode in root.ChildNodes)
   {
        int idx = Array.BinarySearch(spisok_num_soed, childnode.Name);
        xw.WriteStartElement(spisok_num_soed[idx+1]);
   }

   if (comboBox3.Text == "ввв")
   {
        xw.WriteStartElement("Елемент1");
        xw.WriteString(comboBox1.Text);
        xw.WriteEndElement();

        xw.WriteStartElement("Отношение");
        xw.WriteString(comboBox2.Text);
        xw.WriteEndElement();

        xw.WriteStartElement("Елемент2");
        xw.WriteStartAttribute("Число", null); //атрибут
        xw.WriteString("10");
        xw.WriteEndAttribute();
        xw.WriteString(comboBox3.Text);
        xw.WriteEndElement();
   }

   xw.WriteEndElement();
   xw.WriteEndElement();

   xw.WriteEndDocument();
   xw.Close();
}

Может сбросите ненавязчивый исходничек или псевдокод.

Спасибо.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 19-07-2011 11:13 » 

Так а у себя малюсенькую ошибочку не хочешь исправить? Во всяком случае попытаться? Если спокойно, внимательно посмотреть, то всё станет ясно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 19-07-2011 11:23 » 

Джон, двойной WriteEndElement?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 19-07-2011 12:31 » 

Да нет. С этим почти порядок. В исходном файле в корне только один элемент - Соединение1, поэтому цикл foreach создаёт тоже только один элемент.
Который потом и закрывается первым WriteEndElement. Наверно так и нужно, я не знаю. Но не это главное.

Я имел в виду алгоритм. Этот код совсем не отображает желаемую логику. С чего это, например, будет существующий элемент сохраняться в исходном файле? Просто из-за того, что это этот же самый файл? Что знает объект xw о нём?
Он просто создаёт новый файл и пишет в него  ... что? N-е количество элементов (должен писать по задумке, но при N>1 этот код не будет работать), где N определяется наличием корневых элементов в исходном файле. "Не далее, не более" (с)
« Последнее редактирование: 19-07-2011 12:33 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 19-07-2011 12:40 » 

Вот и я думаю, зачем такие навороты. Нужно же просто к корневому элементу сделать append еще одного. Не через writer - через DOM.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 19-07-2011 12:54 » 

Если честно, то меня интересует как приведённый выше код получился? Из каких соображений? Слово за автором.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #11 : 19-07-2011 16:29 » 

Виноват. Не совсем понял вопрос. Имеется ввиду на какую литературу я опирался или что пытаюсь достичь программируя таким способом, т.е. что должно делаться в программе?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 19-07-2011 19:05 » 

Конечно, зачем все это.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Gor
Постоялец

ru
Offline Offline

« Ответ #13 : 20-07-2011 12:18 » 

Может быть можно обойтись и без такого кода (C# и особенно XML недавно изучаю). В общем задача такая:

Есть на форме 3 comboBox’а. В 1-ом comboBox’е выбираешь какой-то элемент (исходя из вышеизложенного <Елемент1>ааа</Елемент1>), во 2-ом comboBox’е выбираешь какое-то отношение (исходя из вышеизложенного <Отношение>ббб</Отношение>), а в 3-ем comboBox’е выбираешь какой-то др. элемент (исходя из вышеизложенного <Елемент2 Число="10">ввв</Елемент2>). Должно получиться:

Код: (XML)
<?xml version="1.0" encoding="windows-1251"?>
<Q-144>
        <Соединение1>
                <Елемент1>ааа</Елемент1>
                <Отношение>ббб</Отношение>
                <Елемент2 Число="10">ввв</Елемент2>
        </Соединение1>
</Q-144>
Это получается.

Затем делаешь тоже самое (только другие элементы и отношение между ними). И хотелось бы получить (добавилось <Соединение2>…):
Код: (XML)
<?xml version="1.0" encoding="windows-1251"?>
<Q-144>
        <Соединение1>
                <Елемент1>ааа</Елемент1>
                <Отношение>ббб</Отношение>
                <Елемент2 Число="10">ввв</Елемент2>
        </Соединение1>
        <Соединение2>
                <Елемент1>ггг</Елемент1>
                <Отношение Число="50">ддд</Отношение>
                <Елемент2>еее</Елемент2>
        </Соединение2>
</Q-144>
Это не получается, перезаписывается <Соединение1>… на <Соединение2>… .

Извиняюсь если расписал не то, что вас интересовало.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 20-07-2011 13:13 » new

Gor, еще раз: работу с XML нужно построить не через Writer, а через DOM. Нужно создать объект документа, загрузить в него файл, найти корень и добавить к нему дочерний элемент. Я не работаю с C# и не могу назвать имена конкретных классов и методов, но интерфейсы работы с XML в разных средах более-менее одинаковы.

Не важно, что там в GUI (в принципе, понятно).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 20-07-2011 15:59 » 

Виноват. Не совсем понял вопрос. Имеется ввиду на какую литературу я опирался или что пытаюсь достичь программируя таким способом, т.е. что должно делаться в программе?

Конечно же в первую очередь интересует программа. Логика. Алгоритм. На каком языке это объяснять компьютеру - дело второстепенное, а уж комбобоксы там или какой другой источник данных ваще - последнее дело. Что ты хочешь получить понятно с первого раза. Я тебе предложил разобраться с твоим, в принципе работоспособным, кодом. Но начинать надо с алгоритма. Давай начнём с цикла foreach. Что он делает? Для чего нужен? Ведь что-то ты себе думал, когда этот код писал. Какую цель ставил этому кусочку кода? Только не надо мне рассказывать, что он делает, какие переменные кому присваивает. Какая у него задача?
На второе, расскажи, как ты себе представляешь работу XmlTextWriter. Каково его предназначение во всей этой истории?

Это для начала. С этим разберёмся, потом пойдём дальше.

зы Чтобы тебя немного подбодрить, скажу след. принципиально мы ничего менять не будем, а внесём только небольшие изменения в твой код и расставим всё на свои места.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #16 : 20-07-2011 19:45 » 

В цикле foreach происходит поиск  последнего "Соединения" в xml-файле, т.е. <Соединение1>, <Соединение2> или <Соединение3> и т.д. Индекс этого "Соединения" из массива spisok_num_soed присваивается в idx.
Увеличиваем индекс на ед., что бы записать после последнего "Соединения". Например, было <Соединение1> ниже записалось <Соединение2> .
XmlTextWriter нужен для непосредственной записи в xml-файл.

Добавлено через 1 день, 11 часов, 28 минут и 35 секунд:
Джон, куда ты пропал?
« Последнее редактирование: 22-07-2011 07:14 от Gor » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 22-07-2011 08:49 » 

Сорри, вчера напряжённый день выдался. Я как-то просмотрел твой ответ.

Ок. Так. Первый пункт. Цикл foreach. Я так себе это и представил. Теперь давай разберёмся, что же он ещё делает. Обратим внимание вот на эту строчку в цикле:

Код: (C#)
xw.WriteStartElement(spisok_num_soed[idx+1]);

Допустим у тебя уже есть соед1 соед2 соед3. Как будет работать цикл в этом случае? Сначала он берёт первый элемент соед1, вычисляет его индекс в массиве spisok_num_soed, это 0, увеличивает его на 1 и... открывает в xw элемент соед2. Хм... Идём дальше. Следующей итерацие находится соед2, определяется индекс - 1, увеличиваем и... открываем в xw элемент соед3 ... И тд.

В конце цикла, у тебя в xw несколько открытых элементов. Допустим ты это так запланировал. Но где они закрываются? Казалось бы, они должны закрываться тоже в цикле?
Но в этом случае ты получишь пустые элементы. А это не есть твоя цель. Тебе нужно добавить ТОЛЬКО ОДИН элемент.

Как это можно исправить? Подсказка сейчас и на будущее: лучше всего, если один участок кода выполняет только одну задачу, а не несколько. Те, если это поиск максимального номера соединения, то никакого создания элементов в нём быть не должно.

Ну и ещё у этой логики есть небольшой изьян. Что если элементы не отсортированы? соед4 соед2 соед3 соед1. Пока получается, что будет добавлен элемент, номер которого не единицу больше последнего. В примере выше последний соед1, значит будет добавлен элемент соед2, а он у нас уже есть. Неувязочка.

Второй пункт.

Замечательно. XmlTextWriter пишет в файл. Что он туда записывает? Поставь себя не место XmlTextWriter. У тебя чистый лист бумаги. Допустим мы решили проблему в п1. Что будет написано на этом листе? Что будет туда добавлено потом?

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #18 : 24-07-2011 15:45 » 

Т.е.
Код: (C#)
xw.WriteStartElement(spisok_num_soed[idx+1]);
нужно вынести за скобки цикла foreach(...)? Что касается второго пункта. Извиняюсь за тупость, но записано будет <соед1>...</соед1>. Потом это будет перезаписано на <соед2>...</соед2>, а не добавлено как хотелось бы.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 24-07-2011 18:53 » 

Ладно, П1 нужно вынести. В этом случае переменная idx останется неизвестной за перделами цикла, поэтому её тоже нужо вынести. Таким образом поиск последнего (не максимального) элемента выглядит:
Код: (C#)
   int idx = -1;
   foreach (XmlNode childnode in root.ChildNodes)
   {
      idx = Array.BinarySearch(spisok_num_soed, childnode.Name);
   }

Более того, предыдущая версия обладает "неработоспособностью", в случае, если исходный файл пуст. Ибо к действиям внутри цикла не будет обращения.

Ок, в первой редакции решение принимается. Те мы гарантируем, что добавление новых соединений будет осуществляться исключительно нашей логикой.

П2.

Ничего не будет перезаписано. Writer записывает все подряд. Если у тебя стоит два раза подряд открыть элемент (WriteStartElement), то второй будет являться подэлементом первого (допустим ты сделал всё правильно и ЗАКРЫЛ все элементы). Итак, код

Код: (C#)
   xw.WriteStartElement("соед1");
   xw.WriteStartElement("соед2");
   xw.WriteEndElement();
   xw.WriteEndElement();

создаст след. структуру

Код: (XML)
<соед1>
    <соед2>
    </соед2>
</соед1>

Таким образом, для достижения твоей цели нельзя открывать несколько элементов подряд.

Теперь я расскажу тебе, как ты сам себя обманул. Несколько причин: 0. ты изначально не хочешь пользоваться MSDN. 1 твой исходный файл содержит только один элемент. 2. исходный файл содержит ТОЛЬКО один элемент - Соединение1 (было бы их хотя бы 2!). 3. Ты используешь два разных объекта для работы с одим и тем же файлом. Тебе кажется, что элемент перезаписывается. Нифига подобного. Перезаписывается файл. Смотри.

Сначала ты открываешь файл ОЭС.xml. Цикл находит в нём только один элемент и Writer создаёт один новый элемент Соединение2. Никакой другой инфы Writer не содержит, он понятия не имеет о Соединение1 и тд. Он создал только один единственный элемент Соединение2 и его подэлементы. Больше ничего. В итоге, ты завершаешь работу с Writer, те это означает, что он сливает все созданные элементы в файл с именем... ОЭС.xml Те просто перезаписывает оригинал, стирая всё, что в нём находится.

Проинициаллизируй Writer с файлом ОЭС2.xml и сравни его с исходным. Таким образом, чтобы решить задачу с Writer, необходимо КОПИРОВАТЬ все существующие элементы, каждый раз открывая и закрывая новые элементы в цикле. Написание этого кода оставляют тебе в качестве домашнего задания. Это поможет тебе лучше разобраться с работой XmlTextWriter.

А сейчас, давай попробуем решить задачу без него. Ты же сам говоришь, что тебе нужно ДОБАВИТЬ. Так давай добавлять.
Для начала - есть такая замечательная штука - MSDN, без этого справочника никуда. Итак смотрим, что мы имеем - документ:
http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

Какими его ф-ями мы уже воспользовались? Load, чтобы загрузить файл и свойством DocumentElement, те корневым элементом XML документа, к которому мы собственно и хотим добавить новый элемент.
http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.aspx

Оказывается у этого объекта есть ф-я AppendChild, которая добавляет элемент в конце списка подэлементов данного элемента (Adds the specified node to the end of the list of child nodes, of this node), и на которую уже намекнул Димка в самом начале. То что нам нужно.

Давай попробуем. Сначала нам надо создать то, что мы хотим добавить, и не забыть сохранить наш документ в файл. Для начала, я предлагаю сохранять в другой файл, чтобы не разрушать оригинал. Когда всё будет работать как надо, можно записывать в под оригинальным именем. Итак:

Код: (C#)
   XmlElement elem = doc.CreateElement(spisok_num_soed[idx + 1]);
   root.AppendChild(elem);
   doc.Save("ОЭС2.xml");


Таким образом код выглядит:

Код: (C#)
        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
                string[] spisok_num_soed =  { "Соединение1", "Соединение2", "Соединение3", "Соединение4",
                                "Соединение5", "Соединение6", "Соединение7", "Соединение8",  
                                "Соединение9", "Соединение10", "Соединение11", "Соединение12"};

                XmlDocument doc = new XmlDocument();
                doc.Load("ОЭС.xml");
                XmlNode root = doc.DocumentElement;

                int idx = -1;
                foreach (XmlNode childnode in root.ChildNodes)
                {
                     idx = Array.BinarySearch(spisok_num_soed, childnode.Name);
                }

                XmlElement elementConnection = doc.CreateElement(spisok_num_soed[idx + 1]);
                root.AppendChild(elementConnection);

                doc.Save("ОЭС2.xml");
        }
 

Смотрим результат.

Как теперь добавть содержимое этого нового элемента?
« Последнее редактирование: 24-07-2011 18:58 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #20 : 26-07-2011 17:52 » 

Ни бог весть что, но…в общем так.

Код: (C#)
string[] spisok_num_soed = { "Соединение1", "Соединение2", "Соединение3",  "Соединение4",
                              "Соединение5", "Соединение6", "Соединение7", "Соединение8",
                              "Соединение9", "Соединение10", "Соединение11", "Соединение12"};
               
XmlDocument doc = new XmlDocument();
doc.Load("ОЭС.xml");
XmlNode root = doc.DocumentElement;

foreach (XmlNode childnode in root.ChildNodes)
{
    idx = Array.BinarySearch(spisok_num_soed, childnode.Name);
}
XmlElement element = doc.CreateElement(spisok_num_soed[++idx]);
root.AppendChild(element);

element = doc.CreateElement("Елемент1");
element.InnerText = comboBox1.Text;
root.LastChild.AppendChild(element);

element = doc.CreateElement("Отношение");
element.InnerText = comboBox2.Text;
root.LastChild.AppendChild(element);

element = doc.CreateElement("Елемент2");
element.InnerText = comboBox3.Text;
root.LastChild.AppendChild(element);
           
doc.Save("ОЭС2.xml");

Получается (в ОЭС2.xml) следующее:

Код: (XML)
<?xml version="1.0" encoding="windows-1251"?>
<Q-144>
        <Соединение1>
                <Елемент1>ааа</Елемент1>
                <Отношение>ббб</Отношение>
                <Елемент2 Число="10">ввв</Елемент2>
        </Соединение1>
        <Соединение2>
                <Елемент1>ггг</Елемент1>
                <Отношение>ддд</Отношение>
                <Елемент2>еее</Елемент2>
        </Соединение2>
</Q-144>

Никак не могу «победить» атрибуты. Перед
Код: (C#)
doc.Save("ОЭС2.xml");
встовляю:

Код: (C#)
XmlAttribute attr;
attr = doc.CreateAttribute("Число");
attr.Value = "50";
doc.DocumentElement.SetAttributeNode(attr);

Атрибуты пишутся, но совершенно не туда, т.е. в <Q-144> и получается <Q-144 Число =«50»>. А надо <Отношение Число="50">ддд</Отношение>.

Что касается XmlTextWriter, то мне кажется, что нельзя XmlDocument, XmlElement и т.д. совместить с XmlTextWriter. в общем – глухо. Хотя хотелось бы (в смысле совместить).

Спасибо.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #21 : 26-07-2011 20:24 » 

Ни бог весть что, но…в общем так.

Как любил говаривать мой завкаф: "Это лучше, чем было, но хуже, чем будет." Иными словами: мыслишь в правильном направлении.

У тебя какие-то ограничения на количество новых перменных в коде? А что если взять, не побояться, да и ввести новую переменную element1 и добавить её к element?

Код: (C#)
XmlElement element1 = doc.CreateElement("Елемент1");
element1.InnerText = comboBox1.Text;
element.AppendChild(element1);

Что получится? А то представь, к <Елемент1> тебе надо будет добавить ещё подэлемент, а к тому ещё... и ещё... Как ты будешь в них ориентироваться? Я уже не говорю о случае, если LastChild будет совсем не "тот" элемент.

Цитата
Никак не могу «победить» атрибуты. Атрибуты пишутся, но совершенно не туда, т.е. в <Q-144> и получается <Q-144 Число =«50»>. А надо <Отношение Число="50">ддд</Отношение>.

1.
Gor, вот эту строчку прокоментируй:

Код: (C#)
doc.DocumentElement.SetAttributeNode(attr);

Что в ней происходит? Что такое DocumentElement? Для понимания происходящего, просто передирать код из MSDN недостаточно. Надо ещё включать мозги и думать, как применить это к твоей ситуации. В MSDN показан пример добавления аттрибута к узлу (элементу). Тебе надо сделать что-то очень похожее.

2.

Почему ты решил использовать SetAttributeNode? Что делает эта ф-я? Что делает ф-я SetAttribute?

Цитата
Что касается XmlTextWriter, то мне кажется, что нельзя XmlDocument, XmlElement и т.д. совместить с XmlTextWriter. в общем – глухо. Хотя хотелось бы (в смысле совместить).

Совмещать ничего не надо. Тем более несовместимое. Один объект работает полностью с XML документом, он его читает, изменяет и сохраняет. А другой ТОЛЬКО пишет XML код. Поэтому в связке с XmlTextWriter должно быть так как ты написал в самой первой версии, только в цикле из объекта XmlDocument необходимо получить информацию о уже существующих элементах и передать их для записи XmlTextWriter. А иначе откуда он должен знать, что там ещё что-то есть?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #22 : 27-07-2011 18:22 » 

С переменными вопрос решил.

Ларчик открывался просто (что касается атрибутов)!

Код: (C#)

XmlElement otn = doc.CreateElement("Отношение");
otn.InnerText = comboBox2.Text;
otn.SetAttribute("Число", "50");
root.LastChild.AppendChild(otn);

в общем – то все получается как надо. Вот только с ОЭС2.xml, а не с ОЭС.xml. Да и с XmlTextWriter (как в самой первой версии) пока не «победил». Джон, может намекнешь чего? Как бы поэффективней это решить (видимо как-то нужно передать объекту необходимую информацию)? Я имею ввиду объект xw (из первой версии).
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 27-07-2011 19:31 » 

С переменными вопрос решил.

Gor, ты честно издеваешься, или понарошку?

Что такое LastChild? Он у тебя всегда будет last?

Вот ты просто, не заморачиваясь, сам вслух проговори: "<Отношение> надо добавить к <Соединение>". Или нет? Не к Last, а тэгу Соединение. Так и добавляй. Что мешает тебе сделать элемент (переменную) соединение и добавлять к нему остальные элементы?
Внимательно посмотри на свой XML файл и представь, что на месте каждого элемента тебе надо вызвать две ф-ции:

элемент = doc.CreateElement( имя элемента)
родитель.AppendChild(элемент);

где "родитель" (в доступной форме) - то что стоит выше и левее. Ага Самый главный родитель - это doc.DocumentElement.

Код: (C#)
        XmlElement elem1 = doc.CreateElement("Елемент1");
        XmlElement elem2 = doc.CreateElement("Елемент2");
        XmlElement relation = doc.CreateElement("Отношение");

        elem1.InnerText = comboBox1.Text;
        relation.InnerText = comboBox2.Text;
        elem2.InnerText = comboBox3.Text;

        relation.SetAttribute("Число", "50");
                       
        XmlElement connection = doc.CreateElement("Соединение2");
        connection.AppendChild(elem1);
        connection.AppendChild(relation);
        connection.AppendChild(elem2);

        root.AppendChild(connection);



Ларчик открывался просто (что касается атрибутов)!

А в чём была проблема с ларчиком? Да и был ли ларчик? Ага



в общем – то все получается как надо. Вот только с ОЭС2.xml, а не с ОЭС.xml.

Не ты точно решил поиздеваться. Внимательно прочитай сообщение #19 и обрати особое внимание на то, что там говорится про запись под другим именем.



Да и с XmlTextWriter (как в самой первой версии) пока не «победил». Джон, может намекнешь чего? Как бы поэффективней это решить (видимо как-то нужно передать объекту необходимую информацию)? Я имею ввиду объект xw (из первой версии).

Чёт я не пойму. Кто тебе сказал, что это будет "поэффективней"? Давай так, сначала ты напишешь алгоритм словами без кода, и, если он будет работать, я помогу тебе перегнать его в код. Подсказка - необходима рекурсия.



В силу:

P.S. Работаю в Visual C# 2008.

задание на каникулы Ага :

(click to show)
Код: (C#)
        string[] spisok_num_soed =  { "Соединение1", "Соединение2", "Соединение3", "Соединение4",
                            "Соединение5", "Соединение6", "Соединение7", "Соединение8",  
                            "Соединение9", "Соединение10", "Соединение11", "Соединение12"};

        var doc = XDocument.Load("d:\\oes.xml");
        var lastNode = doc.Root.LastNode as XElement;
        var idx = (lastNode==null) ? -1 : Array.BinarySearch(spisok_num_soed, lastNode.Name.LocalName);
        doc.Root.Add(new XElement(spisok_num_soed[idx + 1],
                                new XElement("Елемент1", comboBox1.Text),
                                new XElement("Отношение",comboBox2.Text, new XAttribute("Число", 50)),
                                new XElement("Елемент2", comboBox3.Text)));
        doc.Save("d:\\oes.xml");
« Последнее редактирование: 27-07-2011 20:29 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #24 : 28-07-2011 16:10 » 

Большое спасибо Джон! Проработаю, то что ты написал. За вопрос про ОЭС.xml и ОЭС2.xml прошу прощения (совершенно сдибилоидил…от жары видимо).

P.S. Я не издевался!
« Последнее редактирование: 28-07-2011 17:55 от Gor » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #25 : 28-07-2011 19:05 » 

Да, я понял, что не издевался, но что-то надо же было написать. Ага

Ладно, удачи. Я пропадаю на две недели. Но, если будут проблемы, тут есть кому помочь.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Gor
Постоялец

ru
Offline Offline

« Ответ #26 : 13-10-2011 17:43 » 

Привет!


Есть функция:

Код: (C#)
private void button_ob_sh_Click(object sender, EventArgs e)
{
            string[] spisok_num_soed = { "Connection1", "Connection2", "Connection3", "Connection4",
                                         "Connection5", "Connection6", "Connection7", "Connection8",  
                                         "Connection9", "Connection10", "Connection11", "Connection12",
                                         "Connection13", "Connection14", "Connection15", "Connection16",
                                         "Connection17", "Connection18", "Connection19", "Connection20" };

            var doc = XDocument.Load("DOS.xml");
            var lastNode = doc.Root.LastNode as XElement;
            var idx = (lastNode == null) ? -1 : Array.BinarySearch(spisok_num_soed, lastNode.Name.LocalName);

            XElement xConnections = new XElement(spisok_num_soed[++idx],
                                      new XElement("Element1", comboBox1_el_sh.Text,
                                        new XAttribute("attr1_el1", textBox1.Text)),

                                      new XElement("Relation", comboBox_soed.Text,
                                        new XAttribute("attr1_rel", textBox2.Text)),

                                      new XElement("Element2", comboBox2_el_sh.Text,
                                        new XAttribute("attr1_el2", textBox3.Text)));

            doc.Root.Add(xConnections);

            doc.Save("DOS.xml");
}
Нажимаю эту кнопку (записываю в файл XML) до "Connection9" включительно. Все в порядке. При следующем клике вместо записи "Connection10" выдает ошибку «Индекс выходит за пределы массива» и var idx = -21.
В чем тут может быть дело?
Спасибо.

P.S. Работаю в Visual C# 2008.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 13-10-2011 18:09 » 

Два вопроса:

1) А в чём в общих чертах заключается задача? В добавлении в файл DOS.xml элементов Connection<X>?

2) Причём тут WinForms?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Gor
Постоялец

ru
Offline Offline

« Ответ #28 : 14-10-2011 05:35 » 

Спасибо за участие! Нашел в чем ошибка.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 14-10-2011 08:14 » 

Ну ты хоть разобрался как это работает? Можешь теперь сам ответить на вопрос, что эффективней? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines