c# - Linq 从未在 XDocument 中找到元素

标签 c# xml linq-to-xml

我有以下名为 XDocXDocument:

<?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>

我正在编写一个程序,用于搜索插件上次在数据库上运行的时间(如果有的话)。我使用以下两段代码来确定数据库上是否存在插件条目:

        var h = (from el in XDoc.Root.Elements("Database")
                 where el.Element("Plugin").Attribute("PluginName").Value=="FooPlugin" 
                 && el.Attribute("DatabaseName").Value=="c2501_data"
                 select el.Element("Plugin"));

        var e = (from el in XDoc.Root.Elements("Database")
                 where el.Element("Plugin").Attribute("PluginName").Value=="BarPlugin"
                 && el.Attribute("DatabaseName").Value == "c2501_data"
                 select el.Element("Plugin"));


        if ((from el in XDoc.Root.Elements("Database")
             where el.Element("Plugin").Attribute("PluginName").Value == "BarPlugin"
             && el.Attribute("DatabaseName").Value == "c2501_data"
             select el.Element("Plugin")).Count() == 0)
        {
            XElement SpecialPlugin = new XElement("Plugin",
                new XAttribute("PluginName", "BarPlugin"),
                new XAttribute("LastRun", DateTime.Now));

            var CurNode = from node in XDoc.Root.Elements("Database")
                          where (string)node.Attribute("DatabaseName").Value == "c2501_data"
                          select node;

            foreach (var node in CurNode)
                node.Add(SpecialPlugin);

            XDoc.Save(RuntimesPath);
            //XDoc.Root.Elements("Database").Attribute("DatabaseName").
        }

我遇到的问题是,即使明显有 BarPlugin 的条目,计数将始终返回 0,并且 e 将始终无法创建一个不可数的。谁能向我解释为什么会这样? FooPlugin 始终正常工作并返回 h 的插件信息。

感谢您的帮助。

最佳答案

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

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();

关于c# - Linq 从未在 XDocument 中找到元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446759/

相关文章:

c# - 如何用C#连接mysql(简单程序)

c# - Silverlight ChildWindow 在回调时未正确关闭

java - 如何在Android中将菜单设置为工具栏

java - 使用 Jersey 解析子节点

c# - 使用 Linq to XML C# 解析 xml 字符串并检索其属性值

c# - Signalr Connect 断开并重新连接

c# - 管理 C# WPF 应用程序客户端 PC 文件夹中的 3000 个文件

c# - 从 XSD 生成的类不适用于 XmlSerializer

c# - Linq - 无法将类型 'IEnumerable<IEnumerable<.XElement>>' 隐式转换为 'IEnumerable<.XElement>'

c# - 如何在 XML 标记中获取具有特殊字符的 XElement