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>

私も2つのクラスを持っています:

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 ファイルを取得し、2 つのクラスを使用して厳密に型を指定したいので、最終的に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

LINQ への別のアプローチを検討しましたか? たとえば、この回答xsd.exeで説明されているように、を使用して厳密に型指定されたクラスを生成できます。XML からのデータのロードは、この回答の例の逆シリアル化によって行うことができます。

補足: XML は不適切な形式の XML です (最後の行は である必要があります</Settings>)。

于 2013-04-09T17:18:48.290 に答える
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 に答える