[英]LINQ to XML query attributes
使用LINQ to XML,這是我的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="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 />");
}
但我沒有得到任何結果
該屬性不等於 “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中。 請注意,它試圖從“顯示”元素而不是“事件”元素中取“日期”。 我不確定你真的想在這里做什么,所以我把代碼更改為僅轉換為DateTime?
代替。 下面的代碼工作並打印1(即找到與代碼匹配的單個Show元素):
using System;
using System.Linq;
using System.Xml.Linq;
public static class Test
{
static void Main(string[] args)
{
XDocument xDoc = XDocument.Load("shows.xml");
var feeds = from feed in xDoc.Descendants("Show")
where (int) feed.Attribute("Code") == 456
select new
{
EventDate = (DateTime?) feed.Attribute("Date")
};
Console.WriteLine(feeds.Count());
}
}
如果你真的試圖在節目中找到每個事件日期,你需要另一個“from”子句來讓它迭代show中的事件:
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")
};
改變這一行:
where feed.Attribute("Code").Equals("456")
至:
where feed.Attribute("Code").Value.Equals("456")
否則,您將屬性作為對象而不是屬性的值進行比較。
這是另一種方法:
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"));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.