C# 如何使用条件从不同元素获取所有属性

C# 如何使用条件从不同元素获取所有属性,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,嗨,我想通过使用XDocument从上面的XML中获取特定值。我想从不同的商店获得所有的货币价值,这些价值具有相同的日期。我只能从单个商店(ShopA)获得日价值和货币价值 XDocument doc=XDocument.Load(xmlFileName.xml); 变量areaName=doc.Root.Elements(“区域”); IEnumerator s=areaName.Elements(“ShopA”).GetEnumerator(); 而(s.MoveNext()) { var

嗨,我想通过使用XDocument从上面的XML中获取特定值。我想从不同的商店获得所有的货币价值,这些价值具有相同的日期。我只能从单个商店(ShopA)获得日价值和货币价值

XDocument doc=XDocument.Load(xmlFileName.xml);
变量areaName=doc.Root.Elements(“区域”);
IEnumerator s=areaName.Elements(“ShopA”).GetEnumerator();
而(s.MoveNext())
{
var day=s.Current.属性(“day”).值;
var货币=s.Current.属性(“货币”).价值;
}
但我不知道如何从不同的商店得到所有的货币价值,这些商店有相同的日期和正确的编码

你能帮我弄到所有的吗


提前感谢

尝试以下方法:

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

var moneyDayResultSet=来自单据子代中的收入(“收入”)
选择新{
金钱=收入。属性(“金钱”)。价值,
日=收入。属性(“日”)。价值
};
//循环浏览结果
foreach(moneyDayResultSet中的var moneyDayResult){
如果(moneyDayResult.Day==3)
{
Console.Write(moneydaysult.Money);
}
}

也许是这样的吧

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

}
或者,如果您希望获取所有日期的数据,而不是查询一天的数据:

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

使用XPath,您可以在某一天获得商店中的所有资金,如:

        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);
            }
        }
Net中的XPath是通过以下方式找到的:

使用System.Xml.XPath


您可以做的一个相对较小的更改是将
.Elements().Elements()
更改为
.decentants(“收入”)
。不过,我喜欢这段代码,可能对我有用:)
        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);
            }
        }
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
    });