gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:52 25 4
gpt4 key购买 nike

我有以下名为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com