2012-05-24 12 views
8

Tengo un archivo de configuración personalizada.Obtener atributos Nombre y valor del elemento en C# a través de System.Linq

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

He leído este archivo a través de la implementación de la interfaz IConfigurationHandler. Cuando leo los atributos childNode del elemento Detail. Me devuelve el resultado a continuación en la ventana Inmediato de IDE.

elem.Attributes.ToObjectArray() 

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

Cuando trato de escribir en la consola

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

me hace volver

método
Value : 'System.Configuration.ConfigXmlAttribute' 

elem.Attributes.Item(1) me da el nombre y el valor detalle, pero aquí me tiene que pasar el valor del índice de atributo que no conozco actualmente.

Quiero Nombre y valor de atributo a través consulta LINQ y visualización individual en la consola para cada atributo childNode de la siguiente manera:

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

¿Cómo puedo lograr eso?

+0

Cómo lo voy a mejorar. –

+0

¿Qué es lo que estás tratando de hacer aquí? Fix la Console.Writeline? ¿Puedes publicar más de tu código para que podamos entender el flujo? – Jake1164

Respuesta

3

Si desea utilizar este Xml Library se pueden obtener todos los estudiantes y sus detalles con este código:

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(); 

A continuación, iterar sobre ellos usar:

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)); 
} 
3

Se puede utilizar un LINQ Seleccionar y string.join para obtener la salida que desea.

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

'String.Format()' sería una mejor opción: '.Select (a => string.format (" Name = {0}, Value = {1} ", a.Name, a.Value))' – MarcinJuraszek

+0

elem.Attributes.ToObjectArray() .Select (a => "Name =" + a.Name + ", Value =" + a.Value); no dan el a.Name y a.Value aquí. Ya pruebo esto pero no devuelve a.Name y a.Value. –

2

Esta voluntad obtenga todos los atributos de los elementos secundarios del elemento Detalle tal como lo indica en su pregunta.

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)); 
} 
0

Si usted tiene los atributos en un object[] como los escribió, que puede ser burlado por

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

entonces el problema es que usted tiene tipos anónimos cuyos nombres no pueden ser extraído fácilmente

Echa un vistazo a este código (se puede pegar en el método main() de una ventana del editor LINQPad para ejecutarlo):

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(); 

Puesto que no puede acceder a las propiedades Name y valor de la variable Atributos dentro del objeto [] matriz porque el compilador los oculta de usted, el truco está aquí para usar el método de unión (",", a) para solucionar esta limitación.

único que tiene que hacer después es recortar y divide la cadena resultante y, finalmente, crear un nuevo objeto con Valor y Nombre propiedades. Puede probarlo si elimina el comentario de linq.Dump(); línea en LinqPad - devuelve lo que desea y además es consultable por las sentencias de Linq.

Cuestiones relacionadas