Linq to XML查询嵌套元素

时间:2013-08-17 00:52:47

标签: c# xml linq

您好我已经为此工作了两天,我不知道为什么它不起作用。我有以下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"));

我做错了什么?我在这里看了几个例子,我只是不明白 感谢

1 个答案:

答案 0 :(得分:0)

  1. 您必须在查询开头添加Root属性调用(或Element("Users"))。
  2. 当您知道元素在树结构中的确切位置时,应使用Elements而不是Descendants
  3. 您为什么开始从trans开始查询item而不是accts,而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")); 已在此处定义?
  4. 那个工作并返回3个项目

    {{1}}