LINQ to XML不起作用

本文关键字:不起作用 XML to LINQ | 更新日期: 2023-09-27 18:29:37

在自学C#和VS2010的同时,我正在努力学习用于数据存储的LINQ和XML文件。我想读取一个XML文件,其中包含我在虚拟实验室中用于测试的一些SQL服务器的服务器信息列表。

我的XML文件如下所示:

<?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>

我有一个Windows窗体,它有一个组合框("cbSQLServers")。我想用XML文件的结果填充Form_Load()事件中的ComboBox。

    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.");
        }
    }

我的最终目标是,当我运行程序并从组合框中选择一个项目时,它将在名为LbLog:的表单上的ListBox中显示该服务器的信息

    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("'t Type: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("'t Product: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("'t Database: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("'t UID: " + cbSQLServers.SelectedIndex);
            lbLog.Items.Add("'t PWD: " + cbSQLServers.SelectedIndex);
        */
    }

有人能帮我确定如何使用LINQ从XML文件中读取数据吗?

LINQ to XML不起作用

代码中的

data是一个匿名类型,在上面调用ToString()可能不会得到您想要的结果。

如果以后要在cbSQLServers_SelectedIndexChanged中使用cbSQLServers的各个字段,则应保存对象,而不是将其粉碎为字符串。

创建一个包含所需类型的数据的类:

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;
    }
}

然后保存这种类型的实例:

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

然后在处理程序中,您可以使用所选组合框项目的各个字段:

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

在XML中,元素被称为"Server",但在Linq中,您将其引用为"Server"。大小写需要匹配,因为XML和Linq-to-XML都是区分大小写的。