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"));
我做错了什么?我看了几个例子,就是不明白
感谢
- 您必须在查询的开头添加
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"));