2 votes

Comment obtenir TOUS les attributs de différents éléments avec une condition ?

<Area>
 <ShopA>
  <Income Day="1" Money="100" />
  <Income Day="2" Money="90" />
  <Income Day="3" Money="80" />
  <Income Day="4" Money="70" />
 </ShopA>
 <ShopB>
  <Income Day="3" Money="50" />
  <Income Day="4" Money="40" />
 </ShopB>
</Area>

Bonjour, j'aimerais obtenir une valeur spécifique à partir du XML ci-dessus en utilisant XDocument. Je veux obtenir tous les L'argent qui a les mêmes valeurs Jour de différents magasins . Je ne peux obtenir les valeurs de jour et d'argent que d'un seul magasin (ShopA).

XDocument doc = XDocument.Load(xmlFileName.xml);
var areaName = doc.Root.Elements("Area");
IEnumerator<XElement> s = areaName.Elements("ShopA").GetEnumerator();
While (s.MoveNext())
{
 var day = s.Current.Attribute("Day").Value;
 var money = s.Current.Attribute("Money").Value;
}

Mais je ne sais pas comment obtenir toutes les valeurs monétaires de différents magasins qui ont la même date avec un codage approprié.

Pouvez-vous m'aider à les obtenir tous ?

Merci d'avance

1voto

Wayne Points 3098

Quelque chose comme ça, peut-être ?

    var doc = XDocument.Load("XMLFile1.xml");
    var q =
        doc.Root
           .Elements()
           .Elements()
           .Where(e => e.Attribute("Day").Value == "3")
           .Select(e => new
                            {
                                Shop = e.Parent.Name, 
                                Money = e.Attribute("Money").Value
                            });
    foreach (var e in q)
    {
        Console.WriteLine("{0} {1}", e.Shop, e.Money);
    }

ou si vous souhaitez obtenir des données pour tous les jours au lieu d'interroger un seul jour :

        var doc = XDocument.Load("XMLFile1.xml");
        var q =
            doc.Root
               .Elements()
               .Elements()
               .Select(e => new
                                {
                                    Day = e.Attribute("Day").Value,
                                    Shop = e.Parent.Name, 
                                    Money = e.Attribute("Money").Value
                                })
               .GroupBy(r => r.Day);
        foreach (var e in q)
        {
            Console.WriteLine("Day: {0}", e.Key);
            foreach (var i in e)
            {
                Console.WriteLine("{0} {1}", i.Shop, i.Money);
            }
        }

0voto

Alin Mircea Points 159

Essayez quelque chose comme ceci :

<Area>
<ShopA>
 <Income Day="1" Money="100" />
 <Income Day="2" Money="90" />
 <Income Day="3" Money="80" />
 <Income Day="4" Money="70" />
</ShopA>
<ShopB>
 <Income Day="3" Money="50" />
 <Income Day="4" Money="40" />
</ShopB>
</Area>

var moneyDayResultSet = from Income in doc.Descendants("Income")
       select new { 
           Money = Income.Attribute("Money").Value,
           Day = Income.Attribute("Day").Value
       };

//Loop through results
foreach (var moneyDayResult in moneyDayResultSet){
    if(moneyDayResult.Day == 3)
{
    Console.Write(moneyDayResult.Money);
}

}

0voto

Chuck Savage Points 6106

Vous pouvez obtenir tout l'argent d'un magasin avant un certain jour à l'aide d'un XPath comme :

XElement root = XElement.Load(file);
string day = "2";
var shops = root.XPathSelectElements(
    string.Format("//Income[@Day='{0}']", day))
    .Select(x => new
    {
        Shop = x.Parent.LocalName,
        Money = x.Attribute("Money").Value
    });

XPath dans .Net est trouvé avec l'utilisation suivante :

using System.Xml.XPath ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X