Linq到XML查询嵌套元素

本文关键字:嵌套 元素 查询 XML Linq | 更新日期: 2023-09-27 18:27:56

嗨,我已经做了两天了,我不知道为什么它不起作用。我有以下XML

Data = new XDocument(
             new XDeclaration("1.0", "utf-8", "yes"),
             new XComment("UserData"),
             new XElement("Users",
                 new XElement("user",
                        new XAttribute("name", "Bugs Bunny"),
                        new XAttribute("userID", "bbunny"),
                        new XAttribute("usertype", "Customer"),
                            new XElement("account",
                                new XAttribute("accounttype", "checking"),
                                new XAttribute("actbal", 1000),
                                new XAttribute("actbaldate", "1/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "1/1/2013"),
                                        new XAttribute("tranAmount", 1000),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 1000)))),
                new XElement("user",
                        new XAttribute("name", "Tasmanian Devil"),
                        new XAttribute("userID", "tdevil"),
                        new XAttribute("usertype", "Customer"),
                            new XElement("account",
                                new XAttribute("accounttype", "checking"),
                                new XAttribute("actbal", -20),
                                new XAttribute("actbaldate", "5/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "1/1/2013"),
                                        new XAttribute("tranAmount", 1000),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 1000)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "2/1/2012"),
                                        new XAttribute("tranAmount", 900),
                                        new XAttribute("trantype", "withdrawal"),
                                        new XAttribute("tranBalance", 100)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "5/1/2012"),
                                        new XAttribute("tranAmount", 120),
                                        new XAttribute("trantype", "withdrawal"),
                                        new XAttribute("tranBalance", -20)))),
                new XElement("user",
                        new XAttribute("name", "Sam Sheepdog"),
                        new XAttribute("userID", "ssheepdog"),
                        new XAttribute("usertype", "Customer"),
                        new XElement("account",
                                new XAttribute("accounttype", "checking"),
                                new XAttribute("actbal", 1000),
                                new XAttribute("actbaldate", "5/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "1/1/2013"),
                                        new XAttribute("tranAmount", 1000),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 1000)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "2/1/2012"),
                                        new XAttribute("tranAmount", 500),
                                        new XAttribute("trantype", "transfer"),
                                        new XAttribute("tranBalance", 500)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "5/1/2012"),
                                        new XAttribute("tranAmount", 500),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 1000))),
                       new XElement("account",
                                new XAttribute("accounttype", "savings"),
                                new XAttribute("actbal", 500),
                                new XAttribute("actbaldate", "5/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "5/1/2012"),
                                        new XAttribute("tranAmount", 500),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 500)))),

                 new XElement("user",
                        new XAttribute("name", "Elmer J. Fudd"),
                        new XAttribute("userID", "efudd"),
                        new XAttribute("usertype", "Customer"),
                        new XElement("account",
                                new XAttribute("accounttype", "checking"),
                                new XAttribute("actbal", 100000),
                                new XAttribute("actbaldate", "5/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "1/1/2013"),
                                        new XAttribute("tranAmount", 100000),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 100000)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "2/1/2012"),
                                        new XAttribute("tranAmount", 50000),
                                        new XAttribute("trantype", "transfer"),
                                        new XAttribute("tranBalance", 50000)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "5/1/2012"),
                                        new XAttribute("tranAmount", 50000),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 100000))),
                       new XElement("account",
                                new XAttribute("accounttype", "moneymarket"),
                                new XAttribute("actbal", 50000),
                                new XAttribute("actbaldate", "5/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "5/1/2012"),
                                        new XAttribute("tranAmount", 50000),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 50000)))),
                     new XElement("user",
                        new XAttribute("name", "Ralph Wolf"),
                        new XAttribute("userID", "rwolf"),
                        new XAttribute("usertype", "Customer"),
                        new XElement("account",
                                new XAttribute("accounttype", "checking"),
                                new XAttribute("actbal", 200),
                                new XAttribute("actbaldate", "4/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "1/1/2013"),
                                        new XAttribute("tranAmount", 100),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 100)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "4/1/2012"),
                                        new XAttribute("tranAmount", 100),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 100))),
                       new XElement("account",
                                new XAttribute("accounttype", "savings"),
                                new XAttribute("actbal", 1000),
                                new XAttribute("actbaldate", "4/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "3/1/2013"),
                                        new XAttribute("tranAmount", 400),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 400)),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "4/1/2012"),
                                        new XAttribute("tranAmount", 600),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 1000))),
                       new XElement("account",
                                new XAttribute("accounttype", "moneymarket"),
                                new XAttribute("actbal", 500),
                                new XAttribute("actbaldate", "5/1/2013"),
                                    new XElement("trans",
                                        new XAttribute("tranDate", "5/1/2012"),
                                        new XAttribute("tranAmount", 500),
                                        new XAttribute("trantype", "deposit"),
                                        new XAttribute("tranBalance", 500)))),
                                        ));

我不明白为什么这不会给我一个提供的userID==efudd和accounttype=checking的trans列表。当我调用foreach时,它开始迭代项目,但后来它停止了,什么也找不到。

IEnumerable<Transaction> userAcctInfo = 
    from item in Data.Descendants("user")
    where (string)item.Attribute("usertype") == "Customer" &&
         (string)item.Attribute("userID") == userID
    from accts in item.Descendants("account")
    where (string)accts.Attribute("accounttype") == account
    from trans in item.Descendants("user").Descendants("account").Descendants("trans")
    select new Transaction((DateTime)trans.Attribute("tranDate"),
                            (string)trans.Attribute("trantype"),
                            (decimal)trans.Attribute("tranAmount"),
                            (decimal)trans.Attribute("transBalance"));

我做错了什么?我看了几个例子,就是不明白
感谢

Linq到XML查询嵌套元素

  1. 您必须在查询的开头添加Root属性调用(或Element("Users")
  2. 当您知道元素在树结构中的确切位置时,应该使用Elements而不是Descendants
  3. 为什么从item而不是已经定义的accts开始查询trans

那一个工作并返回3个项目

var userAcctInfo =
    from item in Data.Root.Elements("user")
    where (string)item.Attribute("usertype") == "Customer" &&
          (string)item.Attribute("userID") == userId
    from accts in item.Elements("account")
    where (string)accts.Attribute("accounttype") == account
    from trans in accts.Elements("trans")
    select new Transaction((DateTime)trans.Attribute("tranDate"),
                           (string)trans.Attribute("trantype"),
                           (decimal)trans.Attribute("tranAmount"),
                           (decimal)trans.Attribute("tranBalance"));
相关文章: