2009-05-20 2 views
6

HeloКак получить элемент конфигурации

Может ли кто-нибудь объяснить мне, как получить элемент конфигурации из файла .config. Я знаю, как обрабатывать атрибуты, но не элементы. В качестве примера, я хочу разобрать следующее:

<MySection enabled="true"> 

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

<title> .... </title> 

</MySection> 

Мой C# код выглядит следующим образом до сих пор:

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 
     { 
       ??? 
     } 
    } 

Она работает с атрибутами, как делать с элементами (свойство заголовка в коде выше) ?

ответ

0

Я, наконец, нашел один из способов сделать это.

Существует интерфейс IConfigurationSectionHandler, который позволяет делать то, что я хочу. Она требует, чтобы написать метод

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

После этого, у PARSE раздел самостоятельно, так что я был в состоянии принести XmlElement без проблем:

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

Обратной стороной этого является этот интерфейс устарел, но MSDN заявляет, что он не будет удален из будущих версий фреймворков, поскольку он используется внутренне.

+1

Вы не указали, какую версию .Net вы хотите настроить. Для всех версий выше .Net 1.1 следует отметить [важное замечание] (http://msdn.microsoft.com/en-us/library/system.configuration.iconfigurationsectionhandler (v = vs.110) .aspx): IConfigurationSectionHandler - это устарел в .NET Framework 2.0 и выше. –

0

Вы можете использовать метод ConfigurationManager.GetSection("SectionName") для получения раздела конфигурации в файлах конфигурации.

+1

Это неправильно. Вопрос заключается в том, чтобы настроить дизайн пользовательских конфигурационных разделов. –

4

Вот очень хороший пользовательский конфигурационный раздел дизайнера инструмент, который можно использовать (и это бесплатно):

Configuration Section Designer

EDIT:

Я искал в MSDN, и кажется, что разделы пользовательские конфигурации можно делай то, что хочешь, т.е. получение значения конфигурации из элемента. Пользовательские элементы конфигурации могут содержать другие элементы конфигурации, но значения конфигурации всегда поступают из атрибутов.

Возможно, вы можете поместить свои html-фрагменты в другие файлы и обратиться к ним из конфигурации, например.

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

Уродливое решение для меня. Вы хотели бы настроить заголовок и заголовок страницы html таким образом? :) Я бы не стал, особенно потому, что это будет всего лишь 1 или несколько (html) строк. Это устраняет атрибуты сценария, поскольку пользователь не может использовать CDATA с ними, чтобы иметь возможность устанавливать html-строку. – majkinetor

+0

Ну, тогда вы должны использовать собственный файл конфигурации с пользовательским анализом. – Vizu

+0

Vizu, 1 голос за ссылку Design Section Designer. Сохранял мне много скучной кодировки. Спасибо – Liam

0

Вы можете создать класс, наследующий от System.Configuration.ConfigurationElement, который представляет элемент в разделе конфигурации.

Простой пример в the MSDN documentation for ConfigurationElement.

0

Согласно MSDN, в .NET 4 есть новый CurrentConfiguration свойство, которое дает ссылку на высшем уровне Configuration например, представляющий иерархию конфигурации, текущий ConfigurationElement экземпляр принадлежит.

6

Существует еще один подход к тому, чтобы делать то же самое.

Мы могли бы создать элемент, перекрывая DeserializeElement метод, чтобы получить строковое значение:

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

Возможно, лучше использовать API-интерфейс 'reader.ReadElementContentAsString()'. –

1

Работа с вашим примером, вы собираетесь переопределить десериализации «заголовка» в ConfigurationElement, чтобы получить значение 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(); 
 
     } 
 
    }

Смежные вопросы