如何从web.config中读取嵌套配置元素?

时间:2010-07-12 11:56:14

标签: c# asp.net xml

我需要从web.config中读取配置元素。 让这成为我的web.config。

<family>
  <parents>
    <child name="Hello"/>
    <child name="World"/>
  </parents>
 <parents>
    <child name="Hello1"/>
    <child name="World2"/>
  </parents>
</family>

所以我有这样的东西,我需要把它读成一个集合。 我怎么能这样做????

4 个答案:

答案 0 :(得分:3)

通常,您可以在web.config(或app.config)中存储简单的应用程序设置和连接字符串,但任何更复杂的内容,如对象图或XML(如您的情况),您应该考虑不同的方法

这些可能会有所帮助:

  

How do I store an XML value in my .NET App.Config file

(建议在应用设置中编码XML)

然而,最好有一个单独的XML数据文件,并使用Linq-To-XML(请参阅reference)或XPath以及XmlDocument和相关类将其转换为对象图。


编辑:请参阅另一个答案,该答案允许在配置文件中使用XML。这是对您确切问题的更直接的答案,但我会留在此处以供参考。总的来说,您的数据看起来像不是配置数据(更像是运行时/用户数据)并且不属于.config文件:所以我建议将其存储在单独的XML文件中,并且具有指向单独XML文件的文件名的配置文件条目。


希望有所帮助!

答案 1 :(得分:2)

您需要定义自己的自定义配置部分,这样您就可以正确读取嵌套配置元素。顺便说一下,这与其他所有人使用的方法相同,例如企业库组件,NHibernate等。

您需要采取的步骤非常简单,此处提供了一个教程:

http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

答案 2 :(得分:0)

您需要使用ConfigurationElementCollection类。 请参阅MSDN上的this sample

答案 3 :(得分:0)

public struct Child
{
    public string name;
    public Child(string name)
    {
        this.name = name;
    }
}

public class Parent
{
    public List<Child> childs = new List<Child>();

    public static List<Parent> ReadParentsFromXml(string fileName)
    {
        List<Parent> parents = new List<Parent>();
        System.Xml.XmlTextReader doc = new System.Xml.XmlTextReader(fileName);
        Parent element = new Parent();

        while (doc.Read())
        {
            switch (doc.Name)
            {
                case "parents":
                    if (doc.NodeType == System.Xml.XmlNodeType.EndElement)
                    {
                        parents.Add(element);
                        element = new Parent();
                    }
                    break;
                case "child":
                    if(doc.NodeType != System.Xml.XmlNodeType.EndElement)
                        element.childs.Add(new Child(doc.GetAttribute(0)));
                    break;
            }
        }

        return parents;
    }
}