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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание элементов в xml файл C#, xmltextwriter 
V
    Опции темы
kama3uk
Дата 9.8.2012, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. Вот код который создает xml document

Код

            {
                XmlTextWriter textWritter = new XmlTextWriter(filename, Encoding.Default);
                textWritter.WriteStartDocument();
                textWritter.WriteStartElement("DataSet");
                textWritter.WriteEndElement();
                //textWritter.WriteEndDocument();
                textWritter.Close();
                
            }
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(filename);            

                XmlElement ID = xmlDoc.CreateElement("id"); // Номер реестра 
                ID.InnerText = textBox13.Text;
                xmlDoc.DocumentElement.AppendChild(ID);

и т.д

получается такой xml файл.


Код

<DataSet>
  <id>1</id>
  <indexvz>1</indexvz>
  <date_service>2012-08-09 08:36:53</date_service>
  <operatorfio></operatorfio>
  <oper_wnd_number></oper_wnd_number>
  <payment_sum>1</payment_sum>
  <comission_sum>1,8</comission_sum>
  <bonus_sum>0,00</bonus_sum>
  <iscanceled>0</iscanceled>
  <receiverid></receiverid>
</DataSet>


НО! проблема в том, что мне надо создавать на автомате еще один элемент <Table>

Чтоб было так

Код

<DataSet>
    <Table>
  <id>1</id>
  <indexvz>1</indexvz>
  <date_service>2012-08-09 08:36:53</date_service>
  <operatorfio></operatorfio>
  <oper_wnd_number></oper_wnd_number>
  <payment_sum>1</payment_sum>
  <comission_sum>1,8</comission_sum>
  <bonus_sum>0,00</bonus_sum>
  <iscanceled>0</iscanceled>
  <receiverid></receiverid>
   </Table>
</DataSet>
<Table>
  <id>2</id>
  <indexvz>1</indexvz>
  <date_service>2012-08-09 08:36:53</date_service>
  <operatorfio></operatorfio>
  <oper_wnd_number></oper_wnd_number>
  <payment_sum>1</payment_sum>
  <comission_sum>1,8</comission_sum>
  <bonus_sum>0,00</bonus_sum>
  <iscanceled>0</iscanceled>
  <receiverid></receiverid>
   </Table>

и т.д

создаю еще один елемент 
Код

extWritter.WriteStartElement("Table");

а он зараза ругается.Как быть???
PM MAIL   Вверх
IBS
Дата 9.8.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так круче:
Код

//делаем новый узел и, походу дела, суем в него все, что нужно
var result = new XElement("DataSet",
                new XElement("id",1),
                new XElement("indexvz",1),
                new XElement("data_service",new DateTime(2012,5,10))
                и.т.д.....);
 

Теперь делаем так:
Код

//Берем из нашего узла 7(или сколько надо) элементов
//Создаем новый узел и добавляем их в него
//Заменяем содержимое исходного узла
var table = new XElement("table", result.Elements().Take(7));
result.ReplaceNodes(table) ;
  

Это сообщение отредактировал(а) IBS - 9.8.2012, 11:02
PM MAIL   Вверх
kama3uk
Дата 9.8.2012, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так мне не надо заносить данные, они берутся из текстбоксов.
PM MAIL   Вверх
IBS
Дата 9.8.2012, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(kama3uk @  9.8.2012,  14:00 Найти цитируемый пост)
так мне не надо заносить данные, они берутся из текстбоксов. 


Это же просто пример!! Что тебе мешает заносить туда данные из текстбоксов??
Код

new XElement("id",textBox13.Text)


Получить объект с XML-ем можно так:
Код

var myXml = XElement.Parse("String");

или

var myXml = XElement.load(....);

Менять значения можно так

myXml.Element("tagName")="new value";



Смотри сюда


Это сообщение отредактировал(а) IBS - 9.8.2012, 14:15
PM MAIL   Вверх
kama3uk
  Дата 9.8.2012, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



для меня так сильно круто получается . я только начал c# кавырять.мнебы наоборот как то по проще
PM MAIL   Вверх
IBS
Дата 9.8.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(kama3uk @  9.8.2012,  14:06 Найти цитируемый пост)
для меня так сильно круто получается . я только начал c# кавырять.мнебы наоборот как то по проще


ИМХО
Самый простой и удобный способ работать с xml в C# это как раз так )
PM MAIL   Вверх
kama3uk
Дата 9.8.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спсибки ща попробую.

PM MAIL   Вверх
kama3uk
Дата 9.8.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



делаю так 

Код

 string filename = DateTime.Now.ToString("PL_95000ddMMyyyy") + ".xml";
            if (!File.Exists(filename))
            {
                XElement xel = new XElement(filename, Encoding.Default);
                xel.CreateWriter();
                
                var result = new XElement("DataSet",
                new XElement("id", textBox13.Text),
                new XElement("indexvz", textBox12.Text));
                var table = new XElement("table", result.Elements().Take(3));
                result.ReplaceNodes(table);


каким методом зодать тот самый файл?
PM MAIL   Вверх
IBS
Дата 9.8.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сначала делаешь xml, как я уже писал:
Код

//делаем новый узел и, походу дела, суем в него все, что нужно
var result = new XElement("DataSet",
                new XElement("id",1),
                new XElement("indexvz",1),
                new XElement("data_service",new DateTime(2012,5,10))
                и.т.д.....);


и говоришь result: запиши мне "туда-то"
Код

            result.Save("D:\\xml.xml");


И все ОК

Это сообщение отредактировал(а) IBS - 9.8.2012, 15:39
PM MAIL   Вверх
kama3uk
Дата 10.8.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибки получилось.
Код

string filename = DateTime.Now.ToString("PL_95000ddMMyyyy") + ".xml";

            if (!File.Exists(filename))
            {
                XElement xel = new XElement(filename, Encoding.Default);
                var result = new XElement("DataSet",
                    new XElement("id",textBox1.Text),
                    new XElement("indexvz",textBox2.Text),
                    new XElement("date_service",textBox3.Text));

                var table = new XElement("table", result.Elements().Take(3));
                result.ReplaceNodes(table);
                result.Save(filename);  
            }

а как теперь сделать чтоб xml файл дозаписывался??.А то он при каждом вводе данных старую инфу затерает новой.

чтоб було так 

Код


<DataSet>
  <table>
    <id>1</id>
    <indexvz>1</indexvz>
    <date_service>1</date_service>
  </table>
<table>
    <id>2</id>
    <indexvz>2</indexvz>
    <date_service>2</date_service>
  </table>
<table>
    <id>3</id>
    <indexvz>3</indexvz>
    <date_service>3</date_service>
  </table>
</DataSet>




PM MAIL   Вверх
IBS
Дата 10.8.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я так понял вы хотите, чтобы все само-собой дописывалось в xml-файл. Если так, то это не выйдет, я думаю.
1) Базовые операции с файлами: Можно дописать в конец файла, либо его перезаписать.
2) xml - построен на тегах, все теги вложены в корневой

Отсюда следует, что для дозаписи XML-файла вам придется, в конкретном случае:
1)Считать файл
2)Посмотреть где у него последний закрывающий тег
3)Перед этим файлом добавить инфу = > получить новый xml
4)Сохранить новый xml

То что вы хотите реализовать, в принципе, можно, но боюсь в стандартных средствах такого нет)

Короче, я бы сделал так:
Вам нужно каждый раз считывать файл, парсить его, вносить ВСЕ нужные изменения и перезаписывать.

т.е. Допустим у вас есть такая структура:
Код

<DataSet>
  <table>
    <id>1</id>
    <indexvz>1</indexvz>
    <date_service>1</date_service>
  </table>
<table>
    <id>2</id>
    <indexvz>2</indexvz>
    <date_service>2</date_service>
  </table>
</DataSet>

Вы ее считали распарсили. Далее, с помощью XElement создали такую:
Код

<table>
    <id>3</id>
    <indexvz>3</indexvz>
    <date_service>3</date_service>
  </table>


Теперь к старому элементу(XElemen, который вы распарсили) сделали append (вроде), и у вас теперь есть:
Код

<DataSet>
  <table>
    <id>1</id>
    <indexvz>1</indexvz>
    <date_service>1</date_service>
  </table>
<table>
    <id>2</id>
    <indexvz>2</indexvz>
    <date_service>2</date_service>
  </table>
<table>
    <id>3</id>
    <indexvz>3</indexvz>
    <date_service>3</date_service>
  </table>
</DataSet>

Все, можно делать save

Это сообщение отредактировал(а) IBS - 10.8.2012, 10:31
PM MAIL   Вверх
kama3uk
Дата 10.8.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



XmlDocument бес проблем дописывает.я же с начала и начал его использовать.Но уперся в то что не получалась добывить тег <Table> 
Код

XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(filename);            

                XmlElement ID = xmlDoc.CreateElement("id"); // Номер реестра 
                ID.InnerText = textBox13.Text;
                xmlDoc.DocumentElement.AppendChild(ID);

PM MAIL   Вверх
IBS
Дата 10.8.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не совсем так. Просто там это не так явно, но сохранение происходит при вызове команды close().
Обрати внимание без вызова close ты, по идее, ничего нового в фале увидеть не должен. До вызова твой xml просто висит в памяти и ты как хочешь им манипулируешь )
Т.е. при имении XmlWriter-a, в самом файле изменений не происходит. Да и это было бы неправильно: вдруг тебе надо много поменять, что ему каждый раз лезть в файл? (Это не рационально)

Это сообщение отредактировал(а) IBS - 10.8.2012, 13:19
PM MAIL   Вверх
kama3uk
Дата 14.8.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сделал так.
Код

string filename = DateTime.Now.ToString("PL_95000ddMMyyyy") + ".xml";
            XDocument xd = File.Exists(filename) ? XDocument.Load(filename) : new XDocument(new XElement("DataSet"));
            xd.Root.Add(new XElement("Table",
                new XElement("id", textBox13.Text),
                new XElement("indexvz", textBox12.Text),
                new XElement("date_service", textBox7.Text),
                new XElement("operatorfio", textBox15.Text),
                new XElement("oper_wnd_number", textBox16.Text),
                new XElement("payment_sum", textBox8.Text),
                new XElement("comission_sum", textBox17.Text),
                new XElement("bonus_sum", textBox18.Text),
                new XElement("iscanceled", "0"),
                new XElement("receiverid", textBox19.Text),
                new XElement("receiveredrpou", textBox20.Text),
                new XElement("receivername", textBox21.Text),
                new XElement("receiveracc", textBox22.Text),
                new XElement("receivermfo", textBox23.Text),
                new XElement("receiverbnkname", textBox24.Text),
                new XElement("senderid", textBox25.Text),//нету
                new XElement("senderfio", textBox26.Text),
                new XElement("senderadress", textBox2.Text),
                new XElement("date_", toolStripLabel1.Text),
                new XElement("period", textBox27.Text),
                new XElement("ks", textBox28.Text),
                new XElement("previous_", textBox9.Text),
                new XElement("current_", textBox10.Text),
                new XElement("date_start", textBox5.Text),
                new XElement("date_end", textBox6, textBox6),
                new XElement("operatorid", textBox29.Text),
                new XElement("namevz", textBox30.Text),
                new XElement("paymenttype", textBox32.Text),
                new XElement("sendercity", textBox14.Text),
                new XElement("senderbuilding", textBox3.Text),
                new XElement("senderkorpus", textBox4.Text),
                new XElement("resend_sum", textBox34.Text),
                new XElement("resend_type", textBox35.Text),
                new XElement("payment_type", textBox36.Text),
                new XElement("additionally", "0")));
            xd.Save(filename);

PM MAIL   Вверх
IBS
Дата 14.8.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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