LINQ到XML查询属性
使用LINQtoXML,这是我的XML的一个示例LINQ到XML查询属性,xml,linq,Xml,Linq,使用LINQtoXML,这是我的XML的一个示例 <shows> <Show Code="456" Name="My Event Name"> <Event Code="2453" VenueCode="39" Date="2010-04-13 10:30:00" /> <Event Code="2454" VenueCode="39" Date="2010-04-13 13:30:00" /> <Event Code
<shows>
<Show Code="456" Name="My Event Name">
<Event Code="2453" VenueCode="39" Date="2010-04-13 10:30:00" />
<Event Code="2454" VenueCode="39" Date="2010-04-13 13:30:00" />
<Event Code="2455" VenueCode="39" Date="2010-04-14 10:30:00" />
<Event Code="2456" VenueCode="39" Date="2010-04-14 13:30:00" />
<Event Code="2457" VenueCode="39" Date="2010-04-15 10:30:00" />
</Show>
<Show... />
<Show... />
</shows>
如何返回特定节目的日期列表?我正在查询字符串中传递显示代码(“456”),并希望所有日期/时间作为列表返回
这是我目前掌握的代码:
XDocument xDoc = XDocument.Load("path to xml");
var feeds = from feed in xDoc.Descendants("Show")
where feed.Attribute("Code").Equals("456")
select new
{
EventDate = feed.Attribute("Date").Value
};
foreach(var feed in feeds)
{
Response.Write(feed.EventDate + "<br />");
}
XDocument xDoc=XDocument.Load(“xml路径”);
var feed=来自xDoc.subjects(“Show”)中的提要
其中feed.Attribute(“代码”)等于(“456”)
选择新的
{
EventDate=feed.Attribute(“日期”).Value
};
foreach(变量馈入馈入)
{
响应。写入(feed.EventDate+“
”;
}
但是我没有得到返回的结果更改此行:
where feed.Attribute("Code").Equals("456")
致:
否则,将属性作为对象而不是属性的值进行比较。属性不会等于“456”-它是一个属性,而不是字符串。但是,如果您先将其转换为字符串,它将起作用
var feeds = from feed in xDoc.Descendants("Show")
where (string)feed.Attribute("Code") == "456"
select new
{
EventDate = feed.Attribute("Date").Value
};
另一种选择是int
,以确保它是数字:
var feeds = from feed in xDoc.Descendants("Show")
where (int) feed.Attribute("Code") == 456
select new
{
EventDate = feed.Attribute("Date").Value
};
编辑:好的,我现在有一个简短但完整的程序来显示它的工作
请注意,只有当“Show”元素具有“Date”属性时,您的原始代码才会起作用,而在示例XML中没有该属性。注意,它试图从“Show”元素而不是“Event”元素获取“Date”。我不确定您真正想在这里做什么,因此我将代码改为仅强制转换为DateTime?
。下面的代码工作并打印1(即找到与代码匹配的单个Show元素):
如果您实际上试图查找节目中的每个事件日期,则需要另一个“from”子句使其在节目中的事件上迭代:
var events = from feed in xDoc.Descendants("Show")
where (int) feed.Attribute("Code") == 456
// We can't use event as an identifier, unfortunately
from ev in feed.Elements("Event")
select new
{
EventDate = (DateTime?) ev.Attribute("Date")
};
下面是另一种方法:
var nodes = xmlFile.Nodes()
.OfType<XElement>()
.DescendantNodes()
.OfType<XElement>()
.Where(x => x.Name.LocalName == "Event" && x.Attribute("Code").Value.Contains("456"));
foreach (var node in nodes)
{
Console.WriteLine(node.Attribute("Code"));
}
var nodes=xmlFile.nodes()
第()类
.DegeneratNodes()的
第()类
其中(x=>x.Name.LocalName==“事件”和&x.Attribute(“代码”).Value.Contains(“456”);
foreach(节点中的var节点)
{
Console.WriteLine(node.Attribute(“Code”));
}
@reinierpost:不,他正在尝试迭代Show=“456”中的子事件标记。值“2456”是一个事件代码;-)@普鲁士奇迹-你是对的@kb:正如我在回答中指出的,您试图在Show中找到Date属性,而不是在Event中。你可能需要另一个“from”子句…我以为“Show”不是它自己的。后代,但我知道什么。。。我只是路过。好的,我已经纠正了我的错误,我现在正在评估属性的值,但仍然没有得到结果。正如“reinierpost”所指出的,“不,他试图迭代Show=“456”中的子事件标记。值“2456”是一个事件代码。”这是正确的。我想返回节目代码“456”的所有日期。所以我需要迭代“事件”elements@kb:查看我的编辑。现在还不清楚你到底想对这个日期做什么,但是代码会找到这个节目…谢谢Jon,你上面的帖子解决了我的问题!我在想,我可能需要使用一个additionwhere子句来迭代事件日期!谢谢你,倒过来的建议很好。我喜欢。但是它也可以使用操作符==并且不需要任何技巧,或者我缺少了smthg吗?@serbrech:不,一点也不缺少。我很傻:)会编辑的。
var events = from feed in xDoc.Descendants("Show")
where (int) feed.Attribute("Code") == 456
// We can't use event as an identifier, unfortunately
from ev in feed.Elements("Event")
select new
{
EventDate = (DateTime?) ev.Attribute("Date")
};
var nodes = xmlFile.Nodes()
.OfType<XElement>()
.DescendantNodes()
.OfType<XElement>()
.Where(x => x.Name.LocalName == "Event" && x.Attribute("Code").Value.Contains("456"));
foreach (var node in nodes)
{
Console.WriteLine(node.Attribute("Code"));
}