2011-05-16 15 views
6

Digamos que tengo un archivo XML que tiene este aspecto:LINQ a las consultas XML

<?xml version="1.0" encoding="utf-8"?> 
<Customers> 
    <Customer Name="Jason Voorhees" WeaponPurchased="Machette" SalePrice="499.90" /> 
    <Customer Name="Michael Myers" WeaponPurchased="Kitchen Knife" SalePrice="96.75" /> 
</Customers> 

¿Es posible, con LINQ, a hacer algo como esto :?

foreach customer in Customers select WeaponPurchased where Name equals "Jason Voorhees" 

o:

foreach customer in Customers select customer 
label1.Text += "Name: " + customer.Name + Environment.NewLine + "WeaponPurchased: " + customer.WeaponPurchased; 

que he visto este tipo de consulta antes en MSDN, pero los enlaces en mis favoritos llevará a la página mal ahora, y todavía estoy tratando de encontrar estos ejemplos particulares. Cualquier ayuda es muy apreciada,

Gracias

Respuesta

5

Prueba esto:

var doc = XDocument.Load(Path.Combine(path, "file.xml")); 
var query = from c in doc.Descendants("Customer") 
      where c.Attributes("Name").Single().Value == "Jason Voorhees" 
      select c.Attributes("WeaponPurchased").Single().Value; 

volverá IEnumerable<string> con los nombres de las armas.

+0

Gracias por su ayuda @Ladislav! :) :) :) –

3

intenta utilizar esta consulta

XElement root = XDocument.Load(path).Root; 
var result = root.Elements("Customers"). 
      Where(x => x.Attribute("Name").Value =="Jason Voorhees"). 
      Select(x => x.Attribute("WeaponPurchased").Value)); 

o se puede tratar de crear clases que definen una en XML y deserializar ellos.

1

probar esto

public class Customer 
    { 
     public string Name { get; set; } 
     public string WeaponPurchased { get; set; } 
     public string SalePrice { get; set; } 
    } 

y consultar el xml, como a continuación

var customer = from c in XDocument.Load("XMLPATH").Descendants("Customer") 
          where (string)c.Attribute("Name")=="Jason Voorhees" 
          select new Customer 
          { 
           Name=(string)c.Attribute("Name"), 
           WeaponPurchased = (string)c.Attribute("WeaponPurchased"), 
           SalePrice = (string)c.Attribute("SalePrice"), 

          }; 

      foreach (var item in customer) 
      { 
       Console.WriteLine(item.WeaponPurchased); 

      } 
0

No del todo.

piensa que no hay un Customer donde un atributo tiene un cierto valor, y luego seleccionar un segundo atributo.

algo más parecido a esto:

from customer in Customers 
where customer.Attribute("Name").Value equals "Jason Voorhees" 
select customer.Attribute("WeaponPurchased").Value