LINQ to XML не работает - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь узнать о файлах 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>

У меня есть форма Windows, в которой есть ComboBox ("cbSQLServers").Я хотел бы заполнить этот ComboBox в событии Form_Load () результатами из файла XML.

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

Моя последняя цель в том, чтобы при запуске программы и выборе элемента в ComboBox она отображала информацию для этого сервера в ListBox в форме с именем 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);
        */
    }

Может ли кто-нибудь помочь мне определить, как читать данные из файла XML с помощью LINQ?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

data в вашем коде является анонимным типом, вызов ToString() для этого, вероятно, не даст вам того, что вы хотите.

Если вы хотите позже использовать отдельные поля cbSQLServers вcbSQLServers_SelectedIndexChanged, вам следует сохранить объект, а не разбить его на строку .

Создать класс, содержащий данные в нужных вам типах:

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);
1 голос
/ 30 марта 2012

В вашем XML элемент называется «Сервер», но в вашем Linq вы ссылаетесь на него как «сервер». Кейс должен совпадать, поскольку и XML, и Linq to XML чувствительны к регистру.

...