Avatar billede __Allan__ Seniormester
21. maj 2017 - 19:18 Der er 2 kommentarer og
3 løsninger

Hjælp ønskes til ændring og tilføjelse af data i eksisterende xml-fil

Hej med jer

Jeg er ny i C# og helt ny i XML-filer, så bær lige over med mig, hvis jeg hænger lidt i bremsen eller roder rundt i begreberne...

Jeg har via min C# kode fået dannet en xml-fil som ser sådan ud:
(måske der er en mere korrekt måde at stille det op, men jeg har valgt at holde det simpelt, for at kunne følge med rent forståelsesmæssigt)

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Oprettet d. 21-05-2017 18:20:48-->
<medlemmer>
  <medlem id="">
    <id></id>
    <fornavn></fornavn>
    <efternavn></efternavn>
    <køn></køn>
    <alder></alder>
    <adresse></adresse>
    <postnr></postnr>
    <by></by>
  </medlem>
</medlemmer>


Det er tiltænkt som en skabelon og bevaret data for de medlemmer jeg opretter i programmet, så de stadig eksisterer 2. gang jeg kører programmet.
Jeg ønsker ved at kalde forskellige funktioner, at kunne tilføje, slette, filtrere de forskellige medlemmer.

Til at starte med overskrev jeg hele filen, når jeg forsøgte at tilføje et medlem, så filen bare blev blank.
Jeg har søgt en masse på nettet, men ender konstant med at forvirre mig selv i begreberne XmlDocument, XDocument, XElement, XmlNode, XmlWriter og XmlReader m.fl.

Først og fremmest har jeg brug for at filen bliver opdateret med de input jeg får ved oprettelsen af et nyt medlem i programmet.

Ved brugeroprettelsen dannes et array, hvorfra jeg tænker at trække id, navne osv. i form af strenge. Jeg har forsøgt mig med følgende kode:

foreach (var m in liste)
                {
                    XmlDocument data = new XmlDocument();
                    data.Load(data.xml);
                    XElement nytmedlem =
                        new XElement("medlem", new XAttribute("id", m.id),
                            new XElement("id", m.id),
                            new XElement("fornavn", m.forNavn),
                            new XElement("efternavn", m.efterNavn),
                            new XElement("køn", m.køn),
                            new XElement("alder", m.alder),
                            new XElement("adresse", m.adresse),
                            new XElement("postnr", m.postnr),
                            new XElement("by", m.by));
                    nytmedlem.Add(data);
                    data.Save(xmlMedlemmer);
                }


Selvom jeg et hav af gange er endt med at få datatypen frem i konsollen, har jeg nu haft held med læse fra en xml-fil. Dels via "innertext", så jeg fik noget reelt data ud af filen, og dels hele tabel-delen. Nu mangler jeg bare at finde den råde tråd i hvornår man bruger de forskellige funktioner...

Når det kommer til at danne en hel fil, går det fint for mig, problemet er dels når der skal søges i data'ene, og når jeg skal skrive data til filen.
Jeg kan ikke helt følge hvad de forskellige metoder giver mig at arbejde med. Fx :

XmlDocument data = new XmlDocument();
                    data.Load(fil.xml);
og
XElement data = XElement.Load(fil.xml);


Hvad har jeg fat i i ovenstående eksempler? - Er det hele filen eller fx. kun tabellerne jeg kan søge i og arbejde med ?

På mange forskellige sider står der beskrevet hvordan man tilføjer attributter og indhold til xml, men jeg har ikke haft held med at finde et eksempel, hvor hele sammenhængen mellem manipulationen og opdatering af selve filen, står beskrevet...

Nå, men jeg håber at høre fra jer, og at jeg ikke har skræmt jer helt væk med alle mine spørgsmål ;-)
Avatar billede jakobdo Ekspert
21. maj 2017 - 21:26 #1
Når nu du skal indlæse, ændre og gemme data, er der så en årsag til du har valgt XML og ikke en database ?
Jeg ville klart anbefale en database til denne opgave og så "kun" bruge xml, hvis jeg skulle tilbyde brugerne at hente nogle data, som de evt. selv ville arbejde videre med.
Avatar billede __Allan__ Seniormester
21. maj 2017 - 22:02 #2
Hej Jakob

Tak for dit svar.
Det er til en eksamensopgave i C#, der skal afleveres inden længe.
Indtil videre har jeg lært mig selv lidt om blot at gemme data i en tekstfil.
Det fravalgte jeg, da jeg synes det virkede lidt for kluntet at arbejde med.

Min første tanke var også en database, hvilket jeg kan se i mine søgninger, ville kunne gøre tingene betydeligt lettere. Men da jeg hverken havde kendskab til opsætning af db. eller til xml, forestillede jeg mig at jeg gik den "lette" vej ved at vælge xml. Desuden er jeg i tvivl om jeg kunne få det til at virke på skolens computere osv...

(når tiden kommer til det, har jeg en gl. server jeg vil sætte mig ind i at få sat i drift til denne slags formål... Men indtil videre satser jeg på at komme i mål med xml)

Har en formodning om, at når lige jeg forstår begreberne og forskellen på XElement, XDocument, XmlTextWriter, XmlTextReader osv. så skal jeg nok få det til at fungere...

Jeg har senest fået dataene ned i en xlm-fil, men den overskriver den eksisterende fil med de nye data... :-(
Avatar billede arne_v Ekspert
21. maj 2017 - 23:34 #3
Der er to store problemer med XML loesningen:
1) den performer rigtigt daarligt naar der komme rmange medlemmer
2) den er ikke egnet til flerbugersammenhaeng (saa den er ikke egnet til web)
Avatar billede arne_v Ekspert
21. maj 2017 - 23:34 #4
Men hvis du vil hacke videre paa XML loesningen, saa noget kode til inspiration:


using System;
using System.IO;
using System.Xml;

namespace E
{
    public static class Util
    {
        public static string SaveXml(this XmlDocument doc)
        {
            StringWriter sw = new StringWriter();
            doc.Save(sw);
            return sw.ToString();
        }
    }
    public class Medlem
    {
        public int Id { get; set; }
        public string ForNavn { get; set; }
        public string EfterNavn { get; set; }
    }
    public static class Medlemmer
    {
        public static void Add(XmlDocument doc, Medlem m)
        {
            XmlNode tempelm = doc.SelectSingleNode("//medlemmer/medlem[id='0']");
            XmlNode newelm = tempelm.CloneNode(true);
            newelm.SelectSingleNode("id/text()").Value = m.Id.ToString();
            newelm.SelectSingleNode("fornavn/text()").Value = m.ForNavn;
            newelm.SelectSingleNode("efternavn/text()").Value = m.EfterNavn;
            doc.DocumentElement.InsertBefore(newelm, tempelm);
        }
        public static void AddToFile(string fnm, Medlem m)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(fnm);
            Add(doc, m);
            doc.Save(fnm);
        }
        public static string AddToString(string xml, Medlem m)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            Add(doc, m);
            return doc.SaveXml();
        }
        public static void Remove(XmlDocument doc, int id)
        {
            XmlNode delelm = doc.SelectSingleNode("//medlemmer/medlem[id='" + id + "']");
            doc.DocumentElement.RemoveChild(delelm);
        }
        public static void RemoveFromFile(string fnm, int id)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(fnm);
            Remove(doc, id);
            doc.Save(fnm);
        }
        public static string RemoveFromString(string xml, int id)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            Remove(doc, id);
            return doc.SaveXml();
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            string xml = @"<medlemmer>
    <medlem>
        <id>0</id>
        <fornavn>-</fornavn>
        <efternavn>-</efternavn>
    </medlem>
</medlemmer>";
            Console.WriteLine(xml);
            xml = Medlemmer.AddToString(xml, new Medlem { Id = 1, ForNavn = "Anders", EfterNavn = "Andersen" });
            xml = Medlemmer.AddToString(xml, new Medlem { Id = 2, ForNavn = "Børge", EfterNavn = "Børgesen" });
            xml = Medlemmer.AddToString(xml, new Medlem { Id = 3, ForNavn = "Christan", EfterNavn = "Christiansen" });
            xml = Medlemmer.RemoveFromString(xml, 2);
            Console.WriteLine(xml);
            Console.ReadKey();
        }
    }
}
Avatar billede __Allan__ Seniormester
21. maj 2017 - 23:47 #5
Super!
Tak for dit svar... Jeg vil prøve at se om ikke jeg få det til at virke på den måde...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester