C# Linq从未在XDocument中找到元素

C# Linq从未在XDocument中找到元素,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有下面的XDocument称为XDoc: <?xml version="1.0" encoding="utf-8"?> <DatabaseList> <Database DatabaseName="c2501_data"> <Plugin PluginName="FooPlugin" LastRun="1/21/2013 3:22:08 PM" /> <Plugin PluginName="Spec

我有下面的
XDocument
称为
XDoc

<?xml version="1.0" encoding="utf-8"?>
   <DatabaseList>
      <Database DatabaseName="c2501_data">
      <Plugin PluginName="FooPlugin" LastRun="1/21/2013 3:22:08 PM" />
      <Plugin PluginName="SpecialPlugin" LastRun="2013-01-21T15:22:09.3791103-05:00" />
      <Plugin PluginName="BarPlugin" LastRun="2013-01-21T15:23:13.0964814-05:00" />
   </Database>
</DatabaseList>
我遇到的问题是,即使有一个明显的
BarPlugin
条目,计数总是返回0,
e
总是无法创建可枚举的。有人能解释一下为什么会这样吗
FooPlugin
始终正常工作,并返回
h
的插件信息


谢谢您的帮助。

您正在选择一个
数据库
元素,其中包含一个名为
Plugin
且具有给定名称的子元素。由于您只有一个
数据库
元素,因此每次都会得到相同的外部元素。然后获取该数据库元素并返回第一个
Plugin
子元素,在本例中,该子元素始终是Foo。您需要找到适当的
数据库
元素,然后查询每个子元素,以便返回它们:

public static XElement GetPlugin(XDocument XDoc, string databaseName, string pluginName)
{
    var h = from database in XDoc.Root.Elements("Database")
            where database.Attribute("DatabaseName").Value == databaseName
            from plugin in database.Elements("Plugin")
            where plugin.Attribute("PluginName").Value == pluginName
            select plugin;

    return h.FirstOrDefault();
}
或者,如果愿意,在方法语法中:

var q = XDoc.Root.Elements("Database")
    .Where(db => db.Attribute("DatabaseName").Value == databaseName)
    .SelectMany(db => db.Elements("Plugin"))
    .Where(plugin => plugin.Attribute("PluginName").Value == pluginName);

return q.FirstOrDefault();
试试这个:

var db = XDoc.Root.Elements("Database");
var z = (from el in db.Elements("Plugin")
        where el.Attribute("PluginName").Value == "BarPlugin"
              && el.Parent.Attribute("DatabaseName").Value == "c2501_data"
              select el).FirstOrDefault();
if(z != null)
    .....
我使用
Elements()
方法获取所有子元素和
Parent
属性以查找父元素“DatabaseName”

代码中的问题是,您的
el.Element()
只搜索第一个元素,因此它只能找到位于xml中第一个位置的“FooPlugin”

从MSDN文档
元素()

获取具有指定XName的第一个子元素(按文档顺序)

var db = XDoc.Root.Elements("Database");
var z = (from el in db.Elements("Plugin")
        where el.Attribute("PluginName").Value == "BarPlugin"
              && el.Parent.Attribute("DatabaseName").Value == "c2501_data"
              select el).FirstOrDefault();
if(z != null)
    .....