#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. Это потрясающе, спасибо. Как мне выполнить цикл по переменному отчету и получить необходимые данные для каждого элемента?