1

我有一个用于设置的 XML 文件。这是一个包含一些元素的示例:

<Settings>
    <Templates>
        <Item name="Home" value="{B0BDB6B6-CB6E-464A-A170-6F88E2B3B10F}" />
        <Item name="DevelopmentLanding" value="{3F66C5BA-BE16-4E29-A9D8-0FFBCEA4C791}" />
        <Item name="EventsLanding" value="{A1D51F12-D449-4933-8C0E-B236F291D050}" />
    </Templates>
    <Application>
        <Item name="MemberDomain" value="extranet" />
        <Item name="SearchCacheHours" value="0" />
        <Item name="SearchCacheMinutes" value="10" />
    </Application>
</Settings>

我也有两门课:

public class Setting
{
    public string Type { get; set; }
    public IEnumerable<SettingItem> SettingItems { get; set; }
}

public class SettingItem
{
    public string Name { get; set; }
    public string Value { get; set; }
}

我想获取 XML 文件并使用我的两个类强烈键入它,所以我最终会得到一个List<Setting>.

这是我到目前为止的代码:

var xml = XDocument.Load(HttpContext.Current.Server.MapPath(AppConfig.SettingsFileLocation));
var root = xml.Root;

var toplevel = root.Elements().AsEnumerable()
                   .Select(item => new Setting
                        {
                            Type = item.Name.ToString(),
                            SettingItems = item.Elements(item.Name.ToString()).AsEnumerable()
                                                        .Select(x => new SettingItem
                                                            {
                                                                Name = x.Attribute("name").ToString(),
                                                                value = x.Attribute("value").ToString()
                                                            }
                                                ).ToList()
                                });

但是,当我运行它时,我在Setting.SettingItems.

我哪里错了?

4

3 回答 3

1

我不确定为什么您的代码不起作用,但是这样的事情应该可以工作:

            var toplevel = doc.Root.Elements().Select(settingElement => new Setting
                {
                    Type = settingElement.Name.LocalName,
                    SettingItems = settingElement.Elements("Item").Select(itemElement => new SettingItem
                        {
                            Name = itemElement.Attribute("name").Value,
                            Value = itemElement.Attribute("value").Value,
                        })
                }).ToList();
于 2013-04-09T16:44:44.483 回答
1

您是否考虑过另一种 LINQ 方法?例如,您可以使用 生成强类型类xsd.exe,如本答案中所述。从 XML 加载数据可以通过反序列化来完成,例如在这个答案中。

旁注:XML 是格式错误的 XML(最后一行应该是</Settings>)。

于 2013-04-09T17:18:48.290 回答
0

你的问题是这条线:

SettingItems = item.Elements(item.Name.ToString()).AsEnumerable()

它应该是:

SettingItems = item.Elements()

您想要项目的所有子元素(“模板”或“应用程序”节点),而不是那些也名为“模板”或“应用程序”的子元素。AsEnumerable 是不必要的,因为 Elements() 已经返回一个 IEnumerable。

于 2013-04-09T16:58:51.030 回答