Чтение XML с разными именами в Combobox C# - PullRequest
1 голос
/ 05 апреля 2020

выглядит очень простой задачей, я очень новичок в c# и не могу найти правильный ответ для этого

У меня есть структура xml ниже (количество элементов различается по количеству )

<config>
<extras>
<dir_update>C:\extension\update.exe</dir_update>
</extras>
<connection_MAIN>
<ip>LOCALHOST,1433</ip>
<bd>DATA</bd>
<user>sa</user>
<password>gzqs=</password>
</connection_MAIN>
<connection_LOBBY>
<ip>10.0.0.2,1433</ip>
<bd>DATA</bd>
<user>sa</user>
<password>I/wqqZIgzqs=</password>
<caixa>5yIz5GPu80s=</caixa>
<printer>cARrmGLQlztLiUDxIJqoPkvJabIiyI9ye4H7t+4muYk=</printer>
</connection_LOBBY>
<connection_FRONT>
<ip>10.0.0.5,1433</ip>
<bd>FIELDS</bd>
<user>sa</user>
<password>I/wqqZIgzqs=</password>
</connection_FRONT>
</config>

Я уже получаю элементы, которые начинаются с "connection_" в моем поле со списком, и мне нужны значения внутри <ip>, <bd>, <user> и <password>, когда я выберите соединение в выпадающем списке.

Проблема, которую я получаю, состоит в том, что он возвращает само слово, а не значение внутри кода ниже

private void Form1_Load(object sender, EventArgs e)
        {
            using(DataSet ds = new DataSet())
            {
                ds.ReadXml(textBox1.Text);
                foreach(DataTable dt in ds.Tables)
                {
                    if (dt.ToString().Contains("conection_"))
                    {
                        comboBox1.Items.Add(dt.ToString().Replace("conection_", ""));
                    }
                }
                comboBox1.SelectedIndex = 0;
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            using(DataSet ds = new DataSet())
            {
                ds.ReadXml(textBox1.Text);
                string v = comboBox1.Text.ToString();
                string ip = ds.Tables[$"conection_{v}"].Columns[0].ToString();
            }
        }

Переменная ip получает значение " ip "и я хочу" LOCALHOST, 1433 ", когда я выбираю первую опцию в своем поле со списком в этом примере.

Также я хочу найти значение столбца по имени (" ip "," bd "), но я, кажется, получаю результаты только при использовании Columns [0], Columns [1].

Я следовал некоторым руководствам, которые я осмотрел, но они не работают в этом формате xml или я смотрю на это неправильно.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Используя Xml Linq Я помещаю результаты в таблицу данных

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("ip", typeof(string));
            dt.Columns.Add("bd", typeof(string));
            dt.Columns.Add("user", typeof(string));
            dt.Columns.Add("password", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);

            foreach(XElement connection in doc.Descendants().Where(x => x.Name.LocalName.StartsWith("connection_")))
            {
                dt.Rows.Add(new object[] {
                    ((string)connection.Name.LocalName).Substring(((string)connection.Name.LocalName).IndexOf("_") + 1),
                    (string)connection.Element("ip"),
                    (string)connection.Element("bd"),
                    (string)connection.Element("user"),
                    (string)connection.Element("password")
                });


            }
            Dictionary<string, DataRow> dict = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("name"), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
            string ip = dict["LOBBY"].Field<string>("ip");

        }
    }
}
0 голосов
/ 05 апреля 2020

Нет необходимости использовать типы данных DataSet и DataTable. Лучший API для обработки XML - это LINQ to XML.

. Проверьте это ниже.

c#

void Main()
{
    const string MAIN = "connection_MAIN";
    string IP = string.Empty;
    string bd = string.Empty;
    string user = string.Empty;
    string password = string.Empty;

    XElement xml = XElement.Parse(@"<config>
    <extras>
        <dir_update>C:\extension\update.exe</dir_update>
    </extras>
    <connection_MAIN>
        <ip>LOCALHOST,1433</ip>
        <bd>DATA</bd>
        <user>sa</user>
        <password>gzqs=</password>
    </connection_MAIN>
    <connection_LOBBY>
        <ip>10.0.0.2,1433</ip>
        <bd>DATA</bd>
        <user>sa</user>
        <password>I/wqqZIgzqs=</password>
        <caixa>5yIz5GPu80s=</caixa>
        <printer>cARrmGLQlztLiUDxIJqoPkvJabIiyI9ye4H7t+4muYk=</printer>
    </connection_LOBBY>
    <connection_FRONT>
        <ip>10.0.0.5,1433</ip>
        <bd>FIELDS</bd>
        <user>sa</user>
        <password>I/wqqZIgzqs=</password>
    </connection_FRONT>
</config>");

    // get needed connection fragment
    IEnumerable<XElement> fragment = xml.Descendants(MAIN);

    // get all needed elements one by one
    IP = fragment.Elements("ip")?.FirstOrDefault().Value;
    bd = fragment.Elements("bd")?.FirstOrDefault().Value;
    user = fragment.Elements("user")?.FirstOrDefault().Value;
    password = fragment.Elements("password")?.FirstOrDefault().Value;
}
...