Avatar billede digitalsoul Nybegynder
04. december 2004 - 10:58 Der er 17 kommentarer og
1 løsning

Tilføje / Slette bruger fra XML dokument

Det jeg søger er en metode til henholdsvis at tilføje en bruger og slette en bruger udfra brugernavn.

Mit XML dokument ser sådan her ud:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="birdusers.xsl"?>
<programnavn>
    <users>
        <user>
        <name>test</name>
        <password>test</password>
        <home>c:</home>
        <activated>yes</activated>
        </user>
       
        <user>
        <name>test2</name>
        <password>test2</password>
        <home>c:</home>
        <activated>yes</activated>
        </user>
   
    </users>
</programnavn>

Jeg har lavet en metode til at checke login, og den virker fint. Men kan ikke rigtigt få de 2 andre til at virke.

    public bool ValidLogin(string pass) {
        XmlDocument doc = new XmlDocument();
                    doc.Load("users.xml");

        foreach (XmlNode node in doc.SelectNodes("/programnavn/users/user")) {
            if ((node.SelectSingleNode("name").InnerText.Equals(user)) && (node.SelectSingleNode("password").InnerText.Equals(pass)) && (node.SelectSingleNode("activated").InnerText.Equals("yes"))) {
                root = node.SelectSingleNode("home").InnerText;
               
                return true;
            }

        }
        return false;
    }
Avatar billede arne_v Ekspert
04. december 2004 - 11:09 #1
Har du læst min artikel http://www.eksperten.dk/artikler/498 ?

Den har eksempel på at tilføje noder !
Avatar billede arne_v Ekspert
04. december 2004 - 11:10 #2
Og du fjerner fra et element med RemoveChild metode.
Avatar billede digitalsoul Nybegynder
04. december 2004 - 11:14 #3
Vil jeg da lige gøre
Avatar billede arne_v Ekspert
04. december 2004 - 11:22 #4
Ellers kan jeg da godt prøve at lave et komplet eksempel.
Avatar billede digitalsoul Nybegynder
04. december 2004 - 11:41 #5
Fixede en opret bruger, ser det ikke meget rigtigt ud? Er lidt i tvivl om XmlNode user = doc.CreateElement("/users/user");    

    public void OpretBruger(string brugernavn, string password, string home, string activated  )
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("blabla.xml");
            XmlNode bruger = doc.CreateElement("name");
            bruger.AppendChild(doc.CreateTextNode(brugernavn));
            XmlNode pass = doc.CreateElement("password");
            pass.AppendChild(doc.CreateTextNode(password));
            XmlNode homeDir = doc.CreateElement("home");
            homeDir.AppendChild(doc.CreateTextNode(home));
            XmlNode act = doc.CreateElement("activated");
            act.AppendChild(doc.CreateTextNode(activated));
           
            XmlNode user = doc.CreateElement("/users/user");
            user.AppendChild(bruger);
            user.AppendChild(pass);
            user.AppendChild(homeDir);
            user.AppendChild(act);

            doc.DocumentElement.AppendChild(user);

            doc.Save("blabla.xml");

        }
Avatar billede arne_v Ekspert
04. december 2004 - 11:52 #6
Det er ikke rigtigt.

Jeg laver lige et eksempel !
Avatar billede arne_v Ekspert
04. december 2004 - 11:52 #7
using System;
using System.Xml;

namespace E4
{
    public class Users
    {
        private string filename;
        private XmlDocument doc;
        public Users(string filename)
        {
            this.filename = filename;
            doc = new XmlDocument();
            doc.Load(filename);
        }
        public bool IsValid(string username, string password)
        {
            XmlNode userelm = doc.SelectSingleNode("programnavn/users/user[name='" + username + "' and password='" + password + "']");
            return (userelm != null);
        }
        public void Add(string username, string password)
        {
            XmlNode usernameelm = doc.CreateElement("name");
            usernameelm.AppendChild(doc.CreateTextNode(username));
            XmlNode passwordelm = doc.CreateElement("password");
            passwordelm.AppendChild(doc.CreateTextNode(password));
            XmlNode homeelm = doc.CreateElement("home");
            homeelm.AppendChild(doc.CreateTextNode("C:"));
            XmlNode activatedelm = doc.CreateElement("activated");
            activatedelm.AppendChild(doc.CreateTextNode("No"));
            XmlNode userelm = doc.CreateElement("user");
            userelm.AppendChild(usernameelm);
            userelm.AppendChild(passwordelm);
            userelm.AppendChild(homeelm);
            userelm.AppendChild(activatedelm);
            doc.DocumentElement.FirstChild.AppendChild(userelm);
            doc.Save(filename);
        }
        public void Remove(string username)
        {
            XmlNode userelm = doc.SelectSingleNode("programnavn/users/user[name='" + username + "']");
            userelm.ParentNode.RemoveChild(userelm);
            doc.Save(filename);
        }
    }
    class MainClass
    {
        public static void Main(string[] args)
        {
            Users usr = new Users(@"C:\users.xml");
            Console.WriteLine(usr.IsValid("test2", "test2"));
            Console.WriteLine(usr.IsValid("test", "xxx"));
            Console.WriteLine(usr.IsValid("test3", "test3"));
            usr.Add("test4", "test4");
            usr.Remove("test");
        }
    }
}
Avatar billede arne_v Ekspert
04. december 2004 - 11:53 #8
Jeg appender det createde element til første element under document root.
Avatar billede arne_v Ekspert
04. december 2004 - 11:54 #9
Og så udnyttede jeg XPath lidt mere end dit oprindelige eksempel.
Avatar billede digitalsoul Nybegynder
04. december 2004 - 12:09 #10
Unhandled Exception: System.NullReferenceException: Object reference not set to
an instance of an object.

Får den der når jeg prøver at slette en bruger som ikke eksistere, jeg skal bare losse remove delen ind i en try catch block for at forhindre programmet går ned?
Avatar billede arne_v Ekspert
04. december 2004 - 12:12 #11
public void Remove(string username)
{
    XmlNode userelm = doc.SelectSingleNode("programnavn/users/user[name='" + username + "']");
    if(userelm != null)
    {
        userelm.ParentNode.RemoveChild(userelm);
        doc.Save(filename);
    }
    else
    {
        // eksisterer ikke
    }
}
Avatar billede digitalsoul Nybegynder
04. december 2004 - 12:17 #12
Jeg siger mange tak for hjælpen :)

Smider du et svar...
Avatar billede arne_v Ekspert
04. december 2004 - 12:18 #13
kommer her
Avatar billede digitalsoul Nybegynder
04. december 2004 - 12:34 #14
Nu man har fat i dig, har nemlig også et andet problem.

<?xml version="1.0" encoding="ISO-8859-1"?>
<serverconfig>
<port>21</port>
<name>xxxx</>
<version>1.0</version>
</serverconfig>

Kan man relativt nemt hente de ting ud og smide dem i et objekt?
Ville være rart at kunne gøre vores applikation lidt mere dynamisk så vi kunne angive porten i et externt dokument.
Avatar billede digitalsoul Nybegynder
04. december 2004 - 12:34 #15
Kan godt oprette et nyt spørgsmål hvis du vil have point for det
Avatar billede arne_v Ekspert
04. december 2004 - 12:36 #16
.NET har en framework for config filer.
Avatar billede arne_v Ekspert
04. december 2004 - 12:38 #17
Avatar billede digitalsoul Nybegynder
04. december 2004 - 12:38 #18
oki, takker :)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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