Zapis odczyt plik XML, Baza Danych

0

Witam mam problem, zapisuje dane takie jak nick, minuty,sekundy , setnesekundy do pliku o nazwie GRACZE.XML i to mi działa ale nadpisuje mi plik a ja chciałbym dopisywać na końcu, następnie nie wiem jak odczytać te dane tak aby porównać czas gry poszczególnych osób i zapisać 5 najlepszych do pliku ranking.xml

KOD:

if (czyKoniecGry == true)
{

                XDocument doc = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"),
      new XComment("Sample RSS Feed"),
      new XElement("rss",
          new XAttribute("version", "2.0"),
          new XElement("channel",
              new XElement("Aplikacja", "Saper 1.0 Beta"),
              new XElement("by", "Damian Mazurek & Kamil Michaliszyn"),
              new XElement("zakaz", "Wszystkie prawa zastrzeżone"),
              new XElement("gracz",
                  new XElement("nick", nick.Text),
                  new XElement("setnesekundy", setnesekundy),
                  new XElement("sekundy", sekundy),
                  new XElement("minuty", minuty),
                  new XElement("data", DateTime.Now.ToUniversalTime())
              ))));
                doc.Save(Application.StartupPath + "\\Data\\GRACZE.xml");
            }
0

Nadpisuje Ci plik, ponieważ tworzysz nowy. Musiałbyś wczytać istniejący i tam dopisać.
Plik XML przeszukuje się po Nodach, ChildNodach oraz ich atrybutach np. poprzez pętlę foreach.

Przykładowy kod:
XmlDocument doc = new XmlDocument();
XMLdoc.Load("filePath");
foreach (XmlNode node in docXML.DocumentElement.ChildNodes)
{
if (node.Name == "xxx")
{
XmlNodeList nodeList = node.ChildNodes;
foreach (XmlNode n in nodeList)
{
if (n.Name == "yyy")
{
foreach (XmlAttribute attr in n.Attributes)
{
if (attr.Name == "zzz")
{
string wynik = attr.value
}}}}}}

0

Pewnie i masz rację tylko, że dopiero zacząłem przygodę z XML i nie bardzo rozumiem kod, który napisałeś może dasz jakieś wyjaśnienie, coś co mogło by mnie nakierować

0

XmlDocument doc = new XmlDocument();

MoroHusky ma kod oparty na XDocument, a nie XmlDocument. Nie podawaj więc przykładu opartego na zupełnie innej klasie, z innej biblioteki.

0

To ma ktoś tak jak napisał kolega wyżej? Potrzebne mi to jest dość pilnie, proszę o pomoc...

0

Proszę

Tak wygląda Twój przykładowy plik XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Sample RSS Feed-->
<rss version="2.0">
  <channel>
    <Aplikacja>Saper 1.0 Beta</Aplikacja>
    <by>Damian Mazurek &amp; Kamil Michaliszyn</by>
    <zakaz>Wszystkie prawa zastrzeżone</zakaz>
    <gracz>
      <nick>nick.Text</nick>
      <setnesekundy>setnesekundy</setnesekundy>
      <sekundy>sekundy</sekundy>
      <minuty>minuty</minuty>
      <data>2012-11-28T18:49:10.5660846Z</data>
    </gracz>
  </channel>
</rss> 

Powstał on z tego:

XDocument doc = new XDocument(
                new XDeclaration("1.0" , "utf-8" , "yes") ,
                new XComment("Sample RSS Feed") ,
                new XElement("rss" , new XAttribute("version" , "2.0") ,
                new XElement("channel" ,new XElement("Aplikacja" , "Saper 1.0 Beta") ,
                    new XElement("by" , "Damian Mazurek & Kamil Michaliszyn") ,
                    new XElement("zakaz" , "Wszystkie prawa zastrzeżone") ,
                    new XElement("gracz" ,
                      new XElement("nick" , "nick.Text") ,
                      new XElement("setnesekundy" , "456") ,
                      new XElement("sekundy" , "23") ,
                      new XElement("minuty" , "2") ,
                      new XElement("data" , DateTime.Now.ToUniversalTime())
                  )))); 

Teraz przeszukiwanie pliku XML:

foreach ( XElement rss in doc.Elements() )
            {
                if ( rss.Name == "rss" )
                    foreach ( XElement channel in rss.Elements() )
                        if ( channel.Name == "channel" )
                            foreach ( XElement gracz in channel.Elements() )
                                if ( gracz.Name == "gracz" )
                                    foreach ( XElement elementGracza in gracz.Elements() )
                                    {
                                        if ( elementGracza.Name == "nick" )
                                            Console.WriteLine(elementGracza.Value);
                                        if ( elementGracza.Name == "setnesekundy" )
                                            Console.WriteLine(elementGracza.Value);
                                        if ( elementGracza.Name == "sekundy" )
                                            Console.WriteLine(elementGracza.Value);
                                        if ( elementGracza.Name == "minuty" )
                                            Console.WriteLine(elementGracza.Value);
                                    }
            } 

Szukamy elementu "rss" i wchodzimy w głąb, czyli przeszukujemy jego elementy w poszukiwaniu elementu "channel", jego również przeszukujemy w poszukiwaniu elementu "gracz". Wynika to z budowy pliku XML. Po znalezieniu elementu "gracz" jesteśmy w domu. Przeszukując jego elementy możemy dostać się do ich wartości.

0

Trochę hardcorowe to przeszukiwanie xml :) można minimalnie łatwiej :P

      var graczElement = doc.Element("rss").Element("channel").Element("gracz");

      Console.WriteLine(graczElement.Element("nick").Value);
      Console.WriteLine(graczElement.Element("setnesekundy").Value);
      Console.WriteLine(graczElement.Element("sekundy").Value);
      Console.WriteLine(graczElement.Element("minuty").Value);

 
0

Wiedziałem, że jest jakiś lepszy sposób. Dzięki jonathan1500.

0

Dzięki czyli odczyt już mam... jeszcze tylko jak zrobić dopisywanie do pliku? Wiem, że nie mogę ciągle tworzyć nowego pliku tylko jeżeli on nie istnieje. .. ale jak to zapisać

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