Условный цикл по XML-файлу, считывание данных только тогда, когда элемент равен значению

#c# #xml

#c# #xml

Вопрос:

У меня есть следующий XML:-

 <Scripts>
<ParseCheck>TEST</ParseCheck>
<COMMON>
    <DBConnections>
        <Connection name = "Book">
            <Instance>SERVER1</Instance>
            <DB>DB1</DB>
            <Provider>SQLOLEDB</Provider>
            <AuthType>Windows</AuthType>
            <User></User>
            <Pwd></Pwd>
        </Connection>
        <Connection name = "Report">
            <Instance>SERVER2</Instance>
            <DB>DB2</DB>
            <Provider>SQLOLEDB</Provider>
            <AuthType>Windows</AuthType>
            <User></User>
            <Pwd></Pwd>
        </Connection>
    </DBConnections>
</COMMON>
  

Код, который у меня есть до сих пор: —

 while (xmlreader.Read())
        {
            switch (xmlreader.NodeType)
            {
                case XmlNodeType.Element: // The node is an element.
                    //Console.Write("<"   xmlreader.Name);

                    while (xmlreader.MoveToNextAttribute())
                        if (xmlreader.Value != "Book")
                        {
                            continue;
                        }
                        else
                        {
                            Console.Write(" "   xmlreader.Name   "='"   xmlreader.Value   "'");
                        }
                    break;
                case XmlNodeType.Text: //Display the text in each element.
                    Console.WriteLine(xmlreader.Value);
                    break;
                case XmlNodeType.EndElement: //Display the end of the element.
                    Console.Write("</"   xmlreader.Name);
                    Console.WriteLine(">");
                    break;
            }
        }
  

Мое требование состоит в том, чтобы захватывать XML-данные только тогда, когда имя соединения = «Book», а остальное забыть.
Как мне добиться этого в C #?
Спасибо.
Ян.





Ответ №1:

С помощью xml linq вы можете получать соединения с помощью словаря

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:temptest.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, Connection> dict = doc.Descendants("Connection")
                .Select(x => new Connection() {
                    name = (string)x.Attribute("name"),
                    instance = (string)x.Element("Instance"),
                    db = (string)x.Element("DB"),
                    provider = (string)x.Element("Provider"),
                    authType = (string)x.Element("AuthType"),
                    user = (string)x.Element("User"),
                    pwd = (string)x.Element("Pwd"),
                })
                .GroupBy(x => x.name, y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            Connection report = dict["Report"];

        }
    }
    public class Connection
    {
        public string name { get; set; }
        public string instance { get; set; }
        public string db { get; set; }
        public string provider { get; set; }
        public string authType { get; set; }
        public string user { get; set; }
        public string pwd { get; set; }
    }

}
  

Комментарии:

1. Это потрясающе, спасибо. Как мне выполнить цикл по переменному отчету и получить необходимые данные для каждого элемента?