2011-08-28 19 views
8

Tengo el siguiente archivo XMLleer el archivo XML utilizando LINQ

<?xml version="1.0" encoding="utf-8"?> 
<Users> 
    <User> 
     <Name>John Smith</Name> 
     <test> 
      <Date>23.05.2011</Date> 
      <points>33</points> 
     </test> 
     <test> 
      <Date>22.06.2011</Date> 
      <points>29</points> 
     </test> 
    </User> 
</Users> 

y me gustaría utilizar LINQ para extraer las fechas y los puntos de las pruebas en las que nombre de usuario es "John Smith" ..

¿cómo construiría mi linq?

he hecho lo siguiente, pero no funciona como deseo:

XElement main = XElement.Load(@"users.xml"); 

string t = "John Smith"; 
var v = from user in main.Elements("User") 
     where t == users.Element("Name").Value 
     select users; 

MessageBox.Show(v.First().Element("Date").Value.ToString()); 
+1

Tu código no debería compilarse. Estás usando 'users' donde deberías usar' user'. Y tiene un error tipográfico en su inicialización 't'. – svick

Respuesta

7

No estoy seguro de qué formato desea que la salida sea, pero este código muestras debería obtener la fecha y puntos. Esto proyecta los resultados en un tipo anónimo:

class Program 
{ 
    static void Main(string[] args) 
    { 
     XElement main = XElement.Load(@"users.xml"); 

     var results = main.Descendants("User") 
      .Descendants("Name") 
      .Where(e => e.Value == "John Smith") 
      .Select(e => e.Parent) 
      .Descendants("test") 
      .Select(e => new { date = e.Descendants("Date").FirstOrDefault().Value, points = e.Descendants("points").FirstOrDefault().Value }); 

     foreach (var result in results) 
      Console.WriteLine("{0}, {1}", result.date, result.points); 
     Console.ReadLine(); 
    } 
} 

Y la salida es:

23.05.2011, 33 
22.06.2011, 29 
+0

GREAT ... gracias ¿cómo insertaría un nuevo nodo "en este ejemplo un tercero" con fecha y puntos para ese usuario (John Smith) en el archivo xml? – brandon

+0

@JohnD Esto fue muy útil. Gracias. –

1
XDocument main = XDocument.Load(@"users.xml"); 

string t = "John Smith"; 
var v = from user in main.Descendants("User") 
    where t == user.Element("Name").Value 
    select user; 

MessageBox.Show(v.First().Element("Date").Value.ToString()); 

debe hacer el truco.

1

probar esto

class Program 
{ 
    static void Main(string[] args) 
    { 
     XElement main = XElement.Parse(
@"<Users> 
    <User> 
     <Name>John Smith</Name> 
     <test> 
      <Date>23.05.2011</Date> 
      <points>33</points> 
     </test> 
     <test> 
      <Date>22.06.2011</Date> 
      <points>29</points> 
     </test> 
    </User> 
</Users>"); 

     var users = 
      from m in main.Elements("User") 
      where (string)m.Element("Name") == "John Smith" 
      select (m.Descendants("test").Descendants("Date").FirstOrDefault().Value); 
     foreach (var user in users) 
      Console.WriteLine(user); 
     Console.ReadLine(); 
    } 
} 

Saludos

0

Y sobre su otra pregunta para añadir otro nodo a John Smith, esta sería la solución:

class Program 
{ 
    static void Main(string[] args) 
    { 
     XElement main = XElement.Parse(
    @"<Users> 
     <User> 
      <Name>Alex</Name> 
      <test> 
       <Date>08.05.2011</Date> 
       <points>4</points> 
      </test> 
     </User> 
     <User> 
      <Name>John Smith</Name> 
      <test> 
       <Date>23.05.2011</Date> 
       <points>33</points> 
      </test> 
      <test> 
       <Date>22.06.2011</Date> 
       <points>29</points> 
      </test> 
     </User> 
    </Users>"); 


    var users = 
     from m in main.Elements("User") 
     where (string)m.Element("Name") == "John Smith" 
     select (m.Descendants("test").Descendants("Date").FirstOrDefault().Value); 

    XElement Mercury = main.Elements("User").Where(p => (String)p.Element("Name") == "John Smith").FirstOrDefault(); 
    Mercury.Add(new XElement("test", new XElement("Date", "06.06.2011"), new XElement("points", "01"))); 

    foreach (var user in main.Elements()) 
     Console.WriteLine(user); 

    Console.ReadLine(); 
} 

}

Dando el siguiente resultado esperado:

<User> 
    <Name>Alex</Name> 
    <test> 
    <Date>08.05.2011</Date> 
    <points>4</points> 
    </test> 
</User> 
<User> 
    <Name>John Smith</Name> 
    <test> 
    <Date>23.05.2011</Date> 
    <points>33</points> 
    </test> 
    <test> 
    <Date>22.06.2011</Date> 
    <points>29</points> 
    </test> 
    <test> 
    <Date>06.06.2011</Date> 
    <points>01</points> 
    </test> 
</User> 
Cuestiones relacionadas