Avatar billede nielsbrinch Nybegynder
06. februar 2004 - 18:31 Der er 5 kommentarer og
1 løsning

Bedre opslag i XML gennem DataSet

Jeg har en XML-fil med følgende indhold:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
  <user username="test1" password="hejsa1"/>
  <user username="test2" password="hejsa2"/>
  <user username="test3" password="hejsa3"/>
  <user username="test4" password="hejsa4"/>
  <user username="test5" password="hejsa5"/>
</root>

Jeg vil gerne slå et username op, og få det tilhørende password. Det gør jeg med følgende metode, som virker!

DataSet ds = new DataSet();
ds = FileHandler.LoadXml("test.xml");
IEnumerator tableEnum = ds.Tables.GetEnumerator();
while (tableEnum.MoveNext()) {
    DataTable dt = (DataTable)tableEnum.Current;
    if (dt.TableName == "user") {
        DataColumn[] dcArray = new DataColumn[1];
        DataColumn dc = dt.Columns["username"];
        dcArray[0] = dc;
        dt.PrimaryKey = dcArray;
        ds.AcceptChanges();
        DataRow dr = dt.Rows.Find(to);
        if (dr == null) {
            return "Ingen fundet";
        }
        else {
            return dr["password"].ToString();
        }
    }
}

Det kan bare ikke passe, det skal være så besværligt, at gøre noget der er så simpelt - specielt når hele .NET er bygget til at håndtere XML. Så jeg vil gerne høre om der er nogen der har en nemmere måde at gøre det på.
Avatar billede nielsbrinch Nybegynder
06. februar 2004 - 18:44 #1
Variablen "to", benyttet ved DataRow dr = dt.Rows.Find(to), indeholder i øvrigt det username jeg er igang med at slå op.
Avatar billede nute Nybegynder
07. februar 2004 - 11:43 #2
nu sidder jeg ikke  med et .net miljø på min maskine, så jeg kan ikke teste.

men jeg ville ikke have lastet det ind i et XmlDocument (System.Xml) objekt, og brugt xpath til at spørge efter det du ønsker:

XmlDocument objXMLDoc = new XmlDocument()
objXMLDoc.Load("test.xml")

XmlElement objRoot = doc.DocumentElement;
XmlNode objNode = objRoot.SelectSingleNode("/root/user[ @username = 'user2']");

if( objNode == null )
{
    return "Ingen fundet";
}
else
{
    return objNode.Attributes.GetNamedItem("password").Value;
}

som skrevet ... dette er ikke testet, da jeg ikke har .net installeret på den maskine jeg sidder på, men dettte skal ikke være særlig langt fra måden du kan hive ud en attribut i et xml dokument

:o]
Avatar billede nielsbrinch Nybegynder
07. februar 2004 - 12:42 #3
Tak for det, nute.

Jeg kunne ellers godt lide idéen om at bruge DataSet, så jeg nemt kunne skifte fra XML-baseret database til f.eks. MySQL.
Avatar billede roger Nybegynder
07. februar 2004 - 13:17 #4
DataSet ds= new DataSet();
ds.ReadXml("test.xml");

DataView dv = new DataView(ds.Tables["user"]);
dv.Sort = "username";

int rowIndex = dv.Find("det username du vil slå op");

string password;

if (rowIndex == -1){
    // Username ikke fundet
}
else
{
    //Username fundet, get password.
    password = dv[rowIndex]["password"].ToString();
}
Avatar billede nielsbrinch Nybegynder
07. februar 2004 - 13:26 #5
Hvorfor sorterer du?
Avatar billede nielsbrinch Nybegynder
07. februar 2004 - 14:03 #6
Mange tak for svaret roger, nu kan jeg bruge DataSet som jeg ville :) det var DataView jeg ikke rigtig var klar over eksisterede.

også tak til dig, nute...
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