[英]Linq to XML query nested elements
嗨,我已经为此工作了两天,但我不知道为什么它不起作用。 我有以下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 = check的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"));
我究竟做错了什么? 我在这里看了几个例子,但我听不懂。
谢谢
Root
属性调用(或Element("Users")
)。 Elements
而不是Descendants
。 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"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.