Dodawania z TextBox do XML

0

Witam mam pewien problem a mianowicie nie wiem jak dodawać do XML zawartość z TextBox do XML. Zrobiłem 3 TextBoxy:
textBox1 = Imię
textBox2 = Nazwisko
textBox3 = Samochód

do tego mam button Dodaj

Struktura XML by była taka (chyba ze macie lepsze pomysły):

<person> <imie></imie> <nazwisko></nazwisko> <samochod></samochod> </person>

Bardzo proszę o pomoc ewentualnie o jakieś konkretne porady. Dopiero zaczynam przygodę z C#

0

Bardzo podoba mi się zapisywanie nazwiska w węźle length i roku urodzenia w width.

  1. Możesz przy użyciu klasy XmlDocument albo XDocument utworzyć sobie ręcznie dokument o takiej strukturze (te klasy mają metody do tworzenia węzłów i atrybutów) i wpisać do niego zawartość TextBoxów.
  2. Możesz utworzyć klasę Person z właściwościami name, lenght i width, utworzyć jej obiekt i wypełnić go danymi z TextBoxów i zapisać przy użyciu klasy XmlSerializer. W tym przypadku XML powstaje automagicznie.
0

Dzięki kolega a mozęsz podesłać mi jakiś konkretny przykładzik jak to zastosować i która metoda by była najlepsza ??

0

Napisałem taki kodzik :

 
private void button1_Click(object sender, EventArgs e)
        {
            XmlTextWriter writer = new XmlTextWriter("test.xml", Encoding.UTF8);
            writer.WriteStartDocument();
            writer.WriteStartElement("Person");
            writer.WriteStartElement("Imie");
            writer.WriteString(textBox1.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Nazwisko");
            writer.WriteString(textBox2.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Samochod");
            writer.WriteString(textBox3.Text);
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Close();
        }

Kod działa tak ze po kliknięciu na Button Tworzy się XML wraz z danymi, ale dane sie nie dodają tylko nadpisują.
Pomoże może ktoś jak zrobić aby dane się dopisywały czyli Tworzył się nowy Person z innymi danymi.
Proszę bardzo o pomoc :) innym użytkownikom tez pewnie się to przyda.

0

tak w skrócie: z tej akcji buttona, to sobie dodawaj to do jakiejś listy obiektów, a dopiero później zapisuj wszystkie obiekty z listy pętlą.

0

Dzięki kolego za pomysł. Ale moim celem jest takie coś uruchamiam program wpisuje: Imię Nazwisko i Samochód np.
1.
John
Brawo
Maluch

Klikam Dodaj
2.
Rychu
Wierta
Fiat
Klikam Dodaj
3.
....

czyli na bieżąco mogę dodawać dane do XML nowych Personów
a teraz jest tak że mogę mieć jednego Persona bo dane się nadpisują.

Proszę o pomoc będę bardzo wdzięczny :)

0

To nie twórz za każdym razem nowego pliku, tylko użyj przeciążonej wersji konstruktora XmlTextWriter, któremu podasz obiekt FileStream z FileMode ustawionym na FileMode.Append.

0

Zrobiłem takie coś ale też lipa z tym pomoże ktoś jak to zrobić bo nie mam juz pojęcia :(

Stream xmlFile = new FileStream(@"test.xml", FileMode.Append);
            XmlTextWriter textWritter = new XmlTextWriter(xmlFile, Encoding.UTF8);
            textWritter.WriteStartDocument();
            textWritter.WriteStartElement("Person");
            textWritter.WriteStartElement("Imie");
            textWritter.WriteString(textBox1.Text.Trim());
            textWritter.WriteEndElement();
            textWritter.WriteStartElement("Nazwisko");
            textWritter.WriteString(textBox2.Text.Trim());
            textWritter.WriteEndElement();
            textWritter.WriteStartElement("Samochod");
            textWritter.WriteString(textBox3.Text.Trim());
            textWritter.WriteEndElement();
            textWritter.WriteEndElement();
            textWritter.WriteEndDocument();
            textWritter.Close();
0
arkagdynia napisał(a)

Dzięki kolego za pomysł. Ale moim celem jest takie coś uruchamiam program wpisuje: Imię Nazwisko i Samochód np.
1.
......
....

czyli na bieżąco mogę dodawać dane do XML nowych Personów
a teraz jest tak że mogę mieć jednego Persona bo dane się nadpisują.

Proszę o pomoc będę bardzo wdzięczny :)

Tak jak robiłeś to na początku, ten fragment włącz w pętlę:

            writer.WriteStartElement("Person");
            writer.WriteStartElement("Imie");
            writer.WriteString(textBox1.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Nazwisko");
            writer.WriteString(textBox2.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Samochod");
            writer.WriteString(textBox3.Text);
            writer.WriteEndElement();
            writer.WriteEndElement();

czyli robisz:

List<Person> people = new List<Person>();

(wcześniej sobie zdefiniuj tą klasę)
w Textboxie w eventcie:

people.Add(new Person(){Imie:TextBox1.Text, Nazwisko: TextBox2.Text, Samochod:TextBox3.Text});

XmlTextWriter writer = new XmlTextWriter("test.xml", Encoding.UTF8);
writer.WriteStartDocument();
foreach(Person person in people)
{
            writer.WriteStartElement("Person");
            writer.WriteStartElement("Imie");
            writer.WriteString(person.Imie);
            writer.WriteEndElement();
            writer.WriteStartElement("Nazwisko");
            writer.WriteString(person.Nazwisko);
            writer.WriteEndElement();
            writer.WriteStartElement("Samochod");
            writer.WriteString(person.Samocho);
            writer.WriteEndElement();
            writer.WriteEndElement();
}
writer.WriteEndDocument();
writer.Close();
0

Ok kolego dodałem to tak :
To jest cały mój kod:

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace XML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            XmlTextWriter writer = new XmlTextWriter("test.xml", Encoding.UTF8);
            writer.WriteStartDocument();
            foreach (Person person in people)
            {
                writer.WriteStartElement("Person");
                writer.WriteStartElement("Imie");
                writer.WriteString(person.Imie);
                writer.WriteEndElement();
                writer.WriteStartElement("Nazwisko");
                writer.WriteString(person.Nazwisko);
                writer.WriteEndElement();
                writer.WriteStartElement("Samochod");
                writer.WriteString(person.Samochod);
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
            writer.WriteEndDocument();
            writer.Close();
        }
    }
}

A Te dwie linijki gdzie mam wstawić ??

List<Person> people = new List<Person>();
people.Add(new Person(){Imie:TextBox1.Text, Nazwisko: TextBox2.Text, Samochod:TextBox3.Text});

Sorry kolega że zawracam Ci głowę dzięki bardzo za pomoc :)

0

koledzy proszę o pomoc z moim problemem bo jeszcze nic nie wymyśliłem w tym temacie :(

0
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace XML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private List<..> people = .....;   // <---------- TU

        private void button1_Click(object sender, EventArgs e)
        {
            ....Add(new ......);            // <<----- I TU

            XmlTextWriter writer = new XmlTextWriter("test.xml", Encoding.UTF8);
            writer.WriteStartDocument();
            foreach (Person person in people)
            {
                writer.WriteStartElement("Person");
                writer.WriteStartElement("Imie");
                writer.WriteString(person.Imie);
                writer.WriteEndElement();
                writer.WriteStartElement("Nazwisko");
                writer.WriteString(person.Nazwisko);
                writer.WriteEndElement();
                writer.WriteStartElement("Samochod");
                writer.WriteString(person.Samochod);
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
            writer.WriteEndDocument();
            writer.Close();
        }
    }
}
0

Wkleiłem tak jak kazałeś kolego i nadal błędy wyskakują:(
Posiadam:

  1. textBox1 , textBox2, TextBox3
  2. label1, label2, label3
  3. button1
    Mój cały kod:
    6873839_bez-tytulu.png
0

pytałeś, odpowiedziałem..

teraz popraw składnię zgodnie z wersją języka jakiej używasz, np. zamiast : daj =, pamiętaj o dopisaniu klasy "Person", bo wygląda na to że o niej zapomniales.. "i juz".

0

Ok wiem że to głowie pytanie ale jak stworzyć tę klasę Person żeby to działało.
I jaką literaturę polecacie do nauki C#

Dopiero stawiam pierwsze kroki wiec wybaczcie mi koledzy :)

0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
 
namespace XML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            XmlTextWriter writer = new XmlTextWriter("test.xml", Encoding.UTF8);
            writer.WriteStartDocument();            
            writer.WriteStartElement("Person");
            writer.WriteStartElement("Imie");
            writer.WriteString(textBox1.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Nazwisko");
            writer.WriteString(textBox2.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Samochod");
            writer.WriteString(textBox3.Text);
            writer.WriteEndElement();
            writer.WriteEndElement();            
            writer.WriteEndDocument();
            writer.Close();
        }
    }
} 

Oczywiście można to zrobić trudniej, ale wydajniej, i ogólnie lepiej. Ale dopiero zaczynasz to myślę, że ten kod powinien ci odpowiadać.

0

Dzięki kolego, tylko ten kod działa tak że za każdym kliknięciem na button1 plik XML się nadpisuje i mogę mieć tylko 1 persona.
A mi wchodzi aby po każdym kliknięciu dopisywał się kolejny person.

Powie ktoś jak to będzie z tą klasą person w poprzednim moim poście :)

0
 public class Person
    {
        public string Imie;
        public string Nazwisko;
        public string Samochod;
    } 

?

0

Po dodaniu 1 Persona ok wszystko działa i zapisuje się
po dodaniu drugiego wywala błąd:(

A cały kod to :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace XML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Person
        {
            public string Imie;
            public string Nazwisko;
            public string Samochod;
        } 
        private List<Person> people = new List<Person>();

        private void button1_Click(object sender, EventArgs e)
        {
            people.Add(new Person(){Imie = textBox1.Text, Nazwisko = textBox2.Text, Samochod = textBox3.Text});

            XmlTextWriter writer = new XmlTextWriter("test.xml", Encoding.UTF8);
            writer.WriteStartDocument();
            foreach (Person person in people)
            {
                writer.WriteStartElement("Person");
                writer.WriteStartElement("Imie");
                writer.WriteString(person.Imie);
                writer.WriteEndElement();
                writer.WriteStartElement("Nazwisko");
                writer.WriteString(person.Nazwisko);
                writer.WriteEndElement();
                writer.WriteStartElement("Samochod");
                writer.WriteString(person.Samochod);
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
            writer.WriteEndDocument();
            writer.Close();
        }
    }
}
 

I chyba ten sposób na rozwiązanie mojego problemu słaby jest gdyż jak dodam coś do XML i uruchomię ponownie program i znowu dodam to dane się nadpisują :( a dodanie Dwóch Personów jest nie możliwe bo program się krzaczy.
Proszę bardzo o pomoc może inny sposób. Kolega sugerował jeszcze takie coś :

"użyj przeciążonej wersji konstruktora XmlTextWriter, któremu podasz obiekt FileStream z FileMode ustawionym na FileMode.Append."

0

Proszę bardzo, działa jak należy:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace XML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private bool started = false;
        private void button1_Click(object sender, EventArgs e)
        {
            FileStream file = new FileStream("test.xml", FileMode.Append);
            XmlTextWriter writer = new XmlTextWriter(file, Encoding.UTF8);
            if (!started)
            {
                writer.WriteStartDocument();
                started = true;
            }            
            writer.WriteStartElement("Person");
            writer.WriteStartElement("Imie");
            writer.WriteString(textBox1.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Nazwisko");
            writer.WriteString(textBox2.Text);
            writer.WriteEndElement();
            writer.WriteStartElement("Samochod");
            writer.WriteString(textBox3.Text);
            writer.WriteEndElement();
            writer.WriteEndElement();            
            writer.Close();
        }

    }
} 

Taka dobra rada ode mnie: najpierw naucz się kompletnych podstaw, a potem się bierz za bardziej skomplikowane rzeczy :)

0

dobre rady dobrymi radami, ale strasznie mnie Ciekawi, jak mu teraz bez tej listy wytlumaczysz jak zrobic przycisk "usuń osobę".. ;)

@arkagdynia: a moglbys wyelaborowac w jaki sposob się "krzaczy"? moze w komunikacie bledu jest wszystko napisane..

0

Zrobiłem wszystko tak jak pisał @Anonim1024

I niby wszystko działa ale jest jedno małe ale

Otóż jednego Persona dodaje dobrze :
6884979_bez-tytulu.jpg

Przy drugim i kolejnym XML się krzaczy :
6884978_2.jpg

0

Dokumenty xml muszą mieć tzw. root, czyli jeden element najwyższego poziomu.

0

Nie wiem czemu chcesz podawać pojedynczo te osoby do pliku xml, skoro masz listę i mógłbyś po wprowadzeniu danych zserializować całą listę. Generalnie nie widzę sensu ręcznego rzeźbienia tego xml'a.
W pierwszym poście somekind zasugerował ci użycie XDocument lub XmlDocument.
Najpierw musisz stworzyć element root (w tym przypadku najsensowniej nazwać go Persons), a do niego dodawać kolejne węzły Person.

Oczywiście musisz na początku mieć xml z pustym tagiem <Persons /> żeby poniższy kod dodał ci kolejną osobę.

var doc = XDocument.Load(...);
doc.Root.Add(new XElement("Person", 
                                             new XElement("Name", textboxName.Text),
                                             new XElement("Surname", textboxSurname.Text),
                                             new XElement("Car", textboxCar.Text));
doc.Save(...);
0

Ok panowie jaka będzie najlepsza metoda rozwiązania tego problemu. Żeby to jakoś miało ręce i nogi. oprócz tego jeszcze chce dodać obiekt DataGridView i mam przygotowany tak że po kliknięciu na button wczytaj obiekt uzupełnia się danymi z XML. a i ewentualnie chciałbym jeszcze dodać możliwość usuwania i edycji danych ale to później na razie tego XML chciałbym ogarnąć żeby dodawało mi te węzły.
Proszę o pomoc ewentualne o strony z przykładami jakimiś konkretnymi które mogły by mi w tym pomóc

0

Najpierw dokładnie zdefiniuj problem. Co chcesz osiągnąć.
Wg mnie ciągłe zapisywanie do xml po jednej osobie nie jest potrzebne.
Masz klasę Person. W aplikacji masz listę obiektów tej klasy, która jest źródłem dla grid'a. Dodanie nowej osoby, to stworzenie instancji klasy i dodanie do listy. Dopiero kliknięcie zapisz powoduje serializację całej kolekcji do xml. Podobnie wczytaj, powoduje deserializację i otrzymujesz listę obiektów Person.
Wydaje mi się że to jest najłatwiejszy scenariusz dla ciebie.

0

Ok @massther problem jest taki jak mówisz Tylko jak by dało radę zrobić to żeby jeszcze te persony były edytowane i można było usuwać. Ja dopiero zaczynam przygodę z tym C# i nie wiem jakie są możliwość a chciałbym żeby to jakoś fajnie grało. Bo przygotowałem sobie już taki formularz z którego można wysłać maila i to tez podepnę później do tego programu. Ale najpierw muszę rozwiązać główny problem mojego projektu. Proszę bardzo o pomoc

0

Ale nie ma najmniejszego problemu żeby usuwać i dodawać obiekty do listy. Po to są kolekcje. Twój program powinien operować na kolekcji. A kiedy zostanie wybrana opcja zapisz dokonywać serializacji. Nie ma też problemu żeby modyfikować istniejący w kolekcji obiekt.

0

To co kolego @massther pomógłbyś mi z tym programem ?? Będę naprawdę bardzo wdzięczny Ci

0

Kodu za ciebie nie napiszę. Rzucę ci hasła o których powinieneś poczytać.
Nazwy typów:
List<T>
XmlSerializer

Data binding http://msdn.microsoft.com/en-us/library/ms752347.aspx

I właściwie to powinno wystarczyć do realizacji twojego zadania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1