2009-05-20 11 views
6

HeloComment obtenir élément de configuration

Quelqu'un peut-il me expliquer comment obtenir élément de configuration à partir du fichier .config. Je sais comment gérer les attributs mais pas les éléments. A titre d'exemple, je veux analyser suivant:

<MySection enabled="true"> 

<header><![CDATA[ <div> .... </div> ]]></header> 

<title> .... </title> 

</MySection> 

Mon code C# ressemble à ceci jusqu'à présent:

public class MyConfiguration : ConfigurationSection 
    { 
     [ConfigurationProperty("enabled", DefaultValue = "true")] 
     public bool Enabled 
     { 
      get { return this["enabled"].ToString().ToLower() == "true" ? true : false; } 
     } 

     [ConfigurationProperty("header")] 
     public string header 
     { 
       ??? 
     } 
    } 

Il fonctionne avec des attributs, comment dois-je faire avec des éléments (propriété d'en-tête dans le code ci-dessus) ?

Répondre

0

J'ai finalement trouvé une façon de le faire.

Il existe une interface IConfigurationSectionHandler qui permet les choses que je veux. Il exige l'un à écrire la méthode

public object Create(object parent, object configContext, XmlNode section) 

Après, u Parse section sur votre propre donc j'ai pu chercher XmlElement de sans problème:

 header = s["header"] != null ? s["header"].InnerText : String.Empty; 
     title = s["title"] != null ? s["title"].InnerText : String.Empty; 

L'inconvénient de c'est cette interface est obsolète mais MSDN indique qu'elle ne sera pas supprimée des futures versions des frameworks car elle est utilisée en interne.

+1

Vous n'avez pas spécifié quelle version de .Net fw vous ciblez. Pour toutes les versions ci-dessus .Net 1.1 an [remarque importante] (http://msdn.microsoft.com/en-us/library/system.configuration.iconfigurationsectionhandler (v = vs.110) .aspx) doit être dit: IConfigurationSectionHandler est obsolète dans .NET Framework 2.0 et supérieur. –

0

Vous pouvez utiliser la méthode ConfigurationManager.GetSection("SectionName") pour obtenir la section de configuration dans les fichiers de configuration.

+1

Il est faux. La question est à propos de chaud pour concevoir une section de configuration personnalisée. –

4

est ici un outil assez bon concepteur de section de configuration personnalisée, vous pouvez utiliser (et gratuit):

Configuration Section Designer

EDIT:

que je recherchais dans MSDN et il semble que les sections de configuration personnalisés peuvent Ne fais pas ce que tu veux, ie. obtenir la valeur de configuration d'un élément. Les éléments de configuration personnalisés peuvent contenir d'autres éléments de configuration, mais les valeurs de configuration proviennent toujours d'attributs.

Peut-être que vous pouvez mettre vos extraits de code HTML dans d'autres fichiers et se référer à eux depuis la config, comme ceci.

<MySection enabled="true"> 
    <header filename="myheader.txt" /> 
    <title filename="mytitle.txt" /> 
</MySection> 
+0

Solution laide pour moi. Souhaitez-vous configurer le titre et l'en-tête de la page html de cette façon? :) Je ne voudrais pas, surtout parce que ça va être seulement 1 ou quelques lignes (html). Cela élimine les attributs du scénario car l'utilisateur ne peut pas utiliser CDATA avec eux pour pouvoir définir la chaîne html. – majkinetor

+0

Eh bien, alors vous devez utiliser un fichier de configuration personnalisé avec l'analyse personnalisée. – Vizu

+0

Vizu, 1 vote pour le lien Configuration Section Designer. Il m'a sauvé beaucoup de codage ennuyeux là-bas. Merci – Liam

0

Selon MSDN, dans .NET 4 il y a une nouvelle propriété CurrentConfiguration qui vous donne une référence au plus haut niveau Configuration instance qui représente la hiérarchie de configuration que l'ConfigurationElement instance actuelle appartient.

6

Il existe une autre approche pour faire la même chose.

Nous pourrions créer un élément en remplaçant la méthode DeserializeElement pour obtenir la valeur de chaîne:

public class EmailTextElement : ConfigurationElement { 

    public string Value { get; private set; } 

    protected override void DeserializeElement(XmlReader reader, bool s) { 
     Value = reader.ReadElementContentAs(typeof(string), null) as string; 
    } 

} 
+1

Il pourrait être préférable d'utiliser l'API 'reader.ReadElementContentAsString()'. –

1

Travailler avec votre exemple, vous allez remplacer le Désérialisation de « tête » dans le ConfigurationElement pour obtenir la valeur CDATA.

<MySection enabled="true"> 
 

 
    <header name="foo"><![CDATA[ <div> .... </div> ]]></header> 
 

 
    <title> .... </title> 
 

 
</MySection>

public sealed class HeaderSection: ConfigurationElement { 
 
     private string __Name, __CDATA; 
 

 
     [ConfigurationProperty("name", IsRequired = true)] 
 
     public string Name { 
 
     get { 
 
      return this.__Name; 
 
     } 
 
     set { 
 
      this.__Name = value; 
 
     } 
 
     } 
 

 
     [ConfigurationProperty("value", IsRequired = true)] 
 
     public string Value { 
 
     get { 
 
      return this.__CDATA; 
 
     } 
 
     set { 
 
      this.__CDATA = value; 
 
     } 
 
     } 
 

 
     protected override void DeserializeElement(System.Xml.XmlReader reader, bool s) { 
 
     this.Name = reader.GetAttribute("name").Trim(); 
 
     string cdata = reader.ReadElementContentAs(typeof(string), null) as string; 
 
     this.Value = cdata.Trim(); 
 
     } 
 
    }

Questions connexes