Avatar billede dj-hupi Nybegynder
07. maj 2008 - 13:30 Der er 8 kommentarer og
1 løsning

Opdater XML med LINQ

Hej alle sammen.
Jeg døjer lidt med et problem da jeg gerne vil update nogen elementer i en XML fil. Den når aldrig at komme ind i foreachen. Så det er tilsyneladende min query som der er noget galt med sikkert.

XML filen ser sådan ud:
<?xml version="1.0" encoding="utf-8" ?>
  <Profile_settings>
  <Username>Brugernavn</Username>
  <Password>B58EB230145F496FB52CEE5D69DB7F21</Password>
  <Lastlogon>07-05-2008 12:05:35</Lastlogon>
  </Profile_settings>

Her er min C# kode:

        public static bool UpdateProfilsettings(string username, string password, string lastlogon)
        {
            try
            {
                string pass = MD5(password);
                string xmlFile = Application.LocalUserAppDataPath.ToString() + "\\AS_Settings_" + username + ".xml";
               
                XElement doc = XElement.Load(Application.LocalUserAppDataPath.ToString() + "\\AS_Settings_" + username + ".xml");
                var query = (from b in doc.Descendants("settings") select b);
                foreach (XElement xe in query)
                    { 
                        //xe.ReplaceWith("Username", username);
                        //xe.ReplaceWith("Password", password);
                        xe.SetElementValue("Lastlogon", lastlogon);
                    }
                doc.Save(xmlFile);
                return true;

            }
            catch
            {
                return false;
            }
        }

Nogen gode bud?

På forhånd tak!
Avatar billede bvli Praktikant
07. maj 2008 - 17:36 #1
doc har ikke nogen descendants der hedder "settings" - den hedder "Profile_settings". Mon ikke det er det?

/B :)
Avatar billede dj-hupi Nybegynder
07. maj 2008 - 18:08 #2
Undskyld, fordi jeg testede lidt, jeg har lige rettet det til Profile_settings og det hjælper ikke.
Avatar billede dj-hupi Nybegynder
07. maj 2008 - 18:10 #3
Den kommer aldrig ind i foreach'en. Elementet doc indeholder:
<Profile_settings>
  <Username>Ziij1nwerqwerq</Username>
  <Password>B58EB230145F496FB52CEE5D69DB7F21wqerqwerqwer</Password>
  <Lastlogon>07-05-2008 13:39:10wqerqwerqwerq</Lastlogon>
</Profile_settings>
Når jeg køre debug.
Avatar billede bvli Praktikant
07. maj 2008 - 18:30 #4
Ok.. Men altså - der er jo heller ingen descendants i dit document element der hedder settings - i og med selve dit document element jo _er_ settings.

Prøv noget a'la:

    class Program
    {
        const string xml = "<settings><userName>hrmpf</userName><password>Pa$$w0rd</password></settings>";
        static void Main(string[] args)
        {
            XElement doc = XElement.Load(new StringReader(xml));
            var query = from b in doc.Descendants() select b;
            foreach (XElement e in query) {
                Console.WriteLine(e.Name);
            }
        }
    }


/B :)
Avatar billede dj-hupi Nybegynder
07. maj 2008 - 19:33 #5
Det du lavede virkede heller ikke (Med tilretninger) :(

XElement doc = XElement.Load(xmlFile);
var query = (from b in doc.Elements("Profile_settings") select b);
foreach (XElement e in query)
{
  e.SetElementValue("Lastlogon", lastlogon);
}

Jeg prøvede at lave lidt om på det så det blev doc.elements istedet for
Descendants - Ingen ændring
Avatar billede winners79 Nybegynder
07. maj 2008 - 22:36 #6
Tror du skal løbe alle noder igennem, noget med:

XmlNode node = XmlDocument.root

også lave en recursiv løkke der løber noder igennen ala

private void recNode(XmlNode node)

renameNode(node);

foreach (XmlNode childnode in node.getChildNodes())
recNode(childNode);

i renameNode kan du så oprette en ny node med de ting der skal ændres også..

node.ParentNode.ReplaceChild(newNode, oldNode);
Avatar billede bvli Praktikant
07. maj 2008 - 22:46 #7
Altså - det eksempel jeg gav dig ryger fint ind i foreach'en. Så kunne forestille mig du har lavet noget galt i dine tilretninger.

Anyway - måske er det ikke det rigtige approach du har valgt til lige sådan noget, som at tilgå specifikke elementer direkte. I øvrigt - hvis det er asp.net, findes der en udmærket profileprovider - der kan de ting du vil der - og samtidig kan gøre det "strongly typed".

/B :)
Avatar billede dj-hupi Nybegynder
08. maj 2008 - 18:32 #8
Bvli, hvilken måde er så den rigtige at tilgå (ændre/rette) elementer i en XML fil?
Avatar billede dj-hupi Nybegynder
09. maj 2008 - 10:03 #9
XElement doc = XElement.Load(Program._xmlFile);
                    IEnumerable<XElement> xmlsettings = (from b in doc.Elements(
                                                        "Profile_settings")
                                                        where ((string)b.Attribute(
                                                        "Userid")).Equals(userid)
                                                        select b);
                    foreach (XElement xe in xmlsettings)
                    {
                        xe.SetElementValue("Username", username);
                        xe.SetElementValue("Password", pass);
                        xe.SetElementValue("Lastlogon", lastlogon);
                    }
                    doc.Save(Program._xmlFile);

Jeg fandt selv ud af det. Gav den et element mere det hjalp lidt.
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