c # - LINQ til XML ikke fungerer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at lære om LINQ og XML-filer til datalagring, mens jeg lærer mig selv C # og VS2010. Jeg vil gerne læse en XML-fil med en liste over serverinfo til nogle SQL-servere, som jeg har i mit virtuelle laboratorium, som jeg bruger til testning.


Min XML-fil ser sådan ud:


<?xml version="1.0" encoding="utf-8" ?>
<ServerList>
    <Server>
        <Name>SQLSVR1</Name>
        <Type>Windows Server 2008 R2</Type>
        <Product>Microsoft SQL Server 2008</Product>
        <Database>AspNetDB</Database>
        <UID>Admin</UID>
        <PWD>!Passw0rd</PWD>
    </Server>

    <Server>
        <Name>SQLSVR2</Name>
        <Type>Windows Server 2008 R2</Type>
        <Product>Microsoft SQL Server 2008</Product>
        <Database>AspNetDB</Database>
        <UID>Admin</UID>
        <PWD>!Passw0rd</PWD>
    </Server>
</ServerList>


Jeg har en Windows-formular, som har en ComboBox ('cbSQLServers'). Jeg vil gerne populere den ComboBox i Form\_Load () -hændelsen med resultaterne fra XML-filen.


    private void Form1\_Load(object sender, EventArgs e)
    {
        string filePath = @"..\..\ServerList.xml";

        if (File.Exists(filePath))
        {
            XDocument xDoc = XDocument.Load(filePath);

            var data = from item in xDoc.Descendants("server")
                       select new
                       {
                           serverName = item.Element("Name").Value,
                           serverType = item.Element("Type").Value,
                           serverProduct = item.Element("Product").Value
                       };

            foreach (var p in data)
                cbSQLServers.Items.Add(p.ToString());
            // I used the Console to test if it was doing anything.
            // Console.WriteLine(p.ToString());
        }
        else
        {
            MessageBox.Show("The file " + filePath + " does not exist.");
        }
    }


Mit endelige mål med dette er, at når jeg kører programmet og vælger et emne fra ComboBox, vil det vise informationen for den server i en ListBox på formularen kaldet LbLog:


    private void cbSQLServers\_SelectedIndexChanged(object sender, EventArgs e)
    {
        /*
         * Pseudo-code...not sure how to pass from Form1\_Load() to \_SelectedIndexChanged.
            lbLog.Items.Add("Server Name: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("	 Type: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("	 Product: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("	 Database: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("	 UID: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("	 PWD: " + cbSQLServers.SelectedIndex);
        */
    }


Kan nogen hjælpe mig med at bestemme, hvordan man læser dataene fra XML-filen med LINQ?

Bedste reference


data i din kode er en anonym type, der kalder ToString(), der sandsynligvis ikke vil give dig det, du vil have.


Hvis du senere vil bruge individuelle felter på cbSQLServers i cbSQLServers\_SelectedIndexChanged, skal du gemme objektet, ikke knuse det i en streng. [11]


Opret en klasse, der indeholder dataene i de ønskede typer:


public class MyServer
{
    public string Name { get; private set };
    public string OS { get; private set };
    public string Product { get; private set };

    public MyServer(string name, string os, string product)
    {
        this.Name = name;
        this.OS = os;
        this.Product = product;
    }
}


Gem derefter forekomster af denne type:


cbSQLServers.DisplayMember = "Name";
foreach (var p in data)
    cbSQLServers.Items.Add(new MyServer(p.servername, p.serverType, p.serverProduct));


Derefter kan du i din håndterer bruge enkelte felter i den valgte combobox-genstand:


MyServer selectedServer = cbSQLServers.SelectedItem as MyServer;
DoWhateverWith(selectedServer.OS);

Andre referencer 1


I dit XML kaldes elementet 'Server', men i din Linq refererer du det til 'server'. Sagen skal matches, da både XML og Linq til XML er store og små bogstaver.