C# LINQ到XML不起作用

C# LINQ到XML不起作用,c#,windows,linq-to-xml,C#,Windows,Linq To Xml,我试图学习用于数据存储的LINQ和XML文件,同时自学C和VS2010。我想读取一个XML文件,其中包含用于测试的虚拟实验室中的一些SQL服务器的服务器信息列表 我的XML文件如下所示: <?xml version="1.0" encoding="utf-8" ?> <ServerList> <Server> <Name>SQLSVR1</Name> <Type>Windows Ser

我试图学习用于数据存储的LINQ和XML文件,同时自学C和VS2010。我想读取一个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>
我的最终目标是,当我运行程序并从组合框中选择一个项目时,它将在名为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("\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文件读取数据

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

代码中的数据是匿名类型,调用ToString可能无法满足您的需要

如果以后要在cbSQLServers\u 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);

@..\\..\\ServerList.xml错误;使用@..\\ServerList.xml或..\..\\ServerList.xml,不要两者都使用。多谢您的帮助。我没有意识到我两个都用过……我想我先逃走了,然后在没有移除逃犯的情况下投了@。哎呀!但它不会影响输出或缺少输出-另一点建议;不要命名标识符xDoc、数据、项目、类型等;这些并不意味着什么。C是一种强类型语言,它将告诉您每种数据类型是什么,您不需要更改名称。标识符应解释其含义。请不要在标题前加C之类的前缀。这就是标签的用途。谢谢。第一次来这里,有很多规则需要记住。迈克,谢谢你!输出面板显示了我做出更改后的控制台输出。Dour High Arch,感谢您提供的示例。我想我们是同时在做这件事的,因为我读了你的链接,并且能够创建一个类来处理数据:`private class SelectedServer{public string serverName,serverType,serverProduct;public SelectedServerstring name,string type,string product{serverName=name;serverType=type;serverProduct=product;}`好吧,我会被诅咒的…我显然不够聪明,不知道如何用代码回复…codetest可以工作,但即使有格式空间也不是一个真正的代码块。哦,好吧。谢谢你的建议,以及到严格类型文章的链接。我仍然在学习我的课程中没有涉及到这些…只是公关的基础知识编程、表单控件和极其基本的OOP。我感谢您的帮助和建议!
MyServer selectedServer = cbSQLServers.SelectedItem as MyServer;
DoWhateverWith(selectedServer.OS);