LINQ to XML查询属性

kb.*_*kb. 5 xml linq

使用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>
Run Code Online (Sandbox Code Playgroud)

如何返回特定节目的日期列表?我在查询字符串中传递显示代码("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 />");
            }
Run Code Online (Sandbox Code Playgroud)

但我没有得到任何结果

Jon*_*eet 10

该属性不等于 "456" - 它是属性,而不是字符串.但是,如果首先将其转换为字符串,它将起作用.

var feeds = from feed in xDoc.Descendants("Show")
            where (string)feed.Attribute("Code") == "456"
            select new
            {
                EventDate = feed.Attribute("Date").Value
            };
Run Code Online (Sandbox Code Playgroud)

另一种方法是int确保它的数字:

var feeds = from feed in xDoc.Descendants("Show")
            where (int) feed.Attribute("Code") == 456
            select new
            {
                EventDate = feed.Attribute("Date").Value
            };
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我现在已经将它作为一个简短但完整的程序来展示它的工作原理.

请注意,只有"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());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你真的试图在节目中找到每个事件日期,你需要另一个"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")
             };
Run Code Online (Sandbox Code Playgroud)


Pru*_*der 6

改变这一行:

where feed.Attribute("Code").Equals("456")
Run Code Online (Sandbox Code Playgroud)

至:

where feed.Attribute("Code").Value.Equals("456")
Run Code Online (Sandbox Code Playgroud)

否则,您将属性作为对象而不是属性的值进行比较.