2011-05-16 8 views
6

Disons simplement dire que j'ai un fichier XML qui ressemble à ceci:requêtes LINQ to 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> 

Est-il possible, avec Linq, de faire quelque chose comme ça :?

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

ou:

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

Je l'ai vu ce type de requête avant sur MSDN, mais les liens dans mes favoris conduisent à la mauvaise page maintenant, et je tente toujours de trouver ces exemples particuliers. Toute aide est très appréciée,

Merci

Répondre

5

Essayez ceci:

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; 

Il retournera IEnumerable<string> avec des noms d'armes.

+0

Merci pour votre @Ladislav aide! :) :) :) –

3

Essayez d'utiliser cette requête

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

Ou vous pouvez essayer de créer des classes qui a définies dans XML et les désérialiser.

1

essayer cette

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

et la requête XML comme ci-dessous

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

Pas tout à fait.

Vous voulez trouver un Customer un attribut a une certaine valeur, puis sélectionnez un second attribut.

quelque chose comme ceci:

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