Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ到XML查询属性_Xml_Linq - Fatal编程技术网

LINQ到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

使用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="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"));
}