Получить имя атрибутов и значение элемента в C# через систему.В LINQ

у меня есть один пользовательский файл конфигурации.

<Students>
 <student>
   <Detail Name="abc" Class="1st Year">
       <add key="Main" value="web"/>
       <add key="Optional" value="database"/>
   </Detail>
 </student>
</Students>

Я прочитал этот файл через реализацию интерфейса IConfigurationHandler. Когда я читаю атрибуты childNode элемента Detail. Это возвращает меня ниже результата в немедленное окно IDE.

elem.Attributes.ToObjectArray()

{object[2]}
    [0]: {Attribute, Name="key", Value="Main"}
    [1]: {Attribute, Name="value", Value="web"}

когда я пытаюсь писать на консоль

 Console.WriteLine("Value '{0}'",elem.Attributes.ToObjectArray());

возвращает меня

Value : 'System.Configuration.ConfigXmlAttribute'

elem.Attributes.Item(1) метод дает мне имя и значение подробно, но здесь мне нужно передать значение индекса атрибута чего я сейчас не знаю.

Я хочу получить имя и значение атрибута через запрос LINQ и индивидуальный дисплей на консоли для каждого атрибута childNode следующим образом:

Value : Name="Key" and Value="Main"
        Name="value", Value="web"

как я могу этого достичь?

4 ответов


Если вы хотите использовать этот Библиотека Xml вы можете получить все студенты и их данные с помощью этого кода:

XElement root = XElement.Load(file); // or .Parse(string)
var students = root.Elements("student").Select(s => new
{
    Name = s.Get("Detail/Name", string.Empty),
    Class = s.Get("Detail/Class", string.Empty),
    Items = s.GetElements("Detail/add").Select(add => new
    {
        Key = add.Get("key", string.Empty),
        Value = add.Get("value", string.Empty)
    }).ToArray()
}).ToArray();

затем перебрать их использовать:

foreach(var student in students)
{
    Console.WriteLine(string.Format("{0}: {1}", student.Name, student.Class));
    foreach(var item in student.Items)
        Console.WriteLine(string.Format("  Key: {0}, Value: {1}", item.Key, item.Value));
}

вы можете использовать Linq выберите и строку.Присоединяйтесь чтобы получить желаемый результат.

string.Join(Environment.NewLine, 
    elem.Attributes.ToObjectArray()
        .Select(a => "Name=" + a.Name + ", Value=" + a.Value)
)

Это получит все атрибуты дочерних элементов элемента Detail, как вы указываете в своем вопросе.

XDocument x = XDocument.Parse("<Students> <student> <Detail Name=\"abc\" Class=\"1st Year\"> <add key=\"Main\" value=\"web\"/> <add key=\"Optional\" value=\"database\"/> </Detail> </student> </Students>");

var attributes = x.Descendants("Detail")
                  .Elements()
                  .Attributes()
                  .Select(d => new { Name = d.Name, Value = d.Value }).ToArray();

foreach (var attribute in attributes)
{
     Console.WriteLine(string.Format("Name={0}, Value={1}", attribute.Name, attribute.Value));
}

Если у вас атрибуты на object[] Как вы писали, над которым можно издеваться

var Attributes = new object[]{
    new {Name="key", Value="Main"},
    new {Name="value", Value="web"}
};

затем проблема заключается в том, что у вас есть анонимные типы, чьи имена не могут быть легко извлечены.

взгляните на этот код (вы можете вставить его в метод main () окна редактора LinqPad для его выполнения):

var linq=from a in Attributes
let s = string.Join(",",a).TrimStart('{').TrimEnd('}').Split(',')
select new 
{
    Value = s[0].Split('=')[1].Trim(),
    Name = s[1].Split('=')[1].Trim()
};
//linq.Dump();

поскольку вы не можете получить доступ к свойствам Name и Value переменной атрибуты внутри