0

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

我究竟做错了什么?我在这里看了几个例子,我就是不明白。
谢谢

4

1 回答 1

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

那个有效并返回 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"));
于 2013-08-17T01:29:35.100 回答