Cómo cargar el archivo de configuración mediante progtwigción

Supongamos que tengo un archivo de configuración personalizado que corresponde a una sección de configuración personalizada y elementos de configuración. Estas clases de configuración se almacenan en una biblioteca.

Config File se ve así

    

¿Cómo puedo cargar y usar programáticamente este archivo de configuración desde Code?

No quiero usar el manejo XML sin formato, pero aprovecho las clases de configuración ya definidas.

Tendrás que adaptarlo a tus necesidades, pero aquí está el código que uso en uno de mis proyectos para hacer justamente eso:

 var fileMap = new ConfigurationFileMap("pathtoconfigfile"); var configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap); var sectionGroup = configuration.GetSectionGroup("applicationSettings"); // This is the section group name, change to your needs var section = (ClientSettingsSection)sectionGroup.Sections.Get("MyTarget.Namespace.Properties.Settings"); // This is the section name, change to your needs var setting = section.Settings.Get("SettingName"); // This is the setting name, change to your needs return setting.Value.ValueXml.InnerText; 

Tenga en cuenta que estoy leyendo un archivo de configuración .net válido. Estoy usando este código para leer el archivo de configuración de un EXE desde una DLL. No estoy seguro de si esto funciona con el archivo de configuración de ejemplo que proporcionó en su pregunta, pero debería ser un buen comienzo.

Vea la serie de tres partes de Jon Rista sobre la configuración de .NET 2.0 en CodeProject.

  • Desentrañando los misterios de la configuración de .NET 2.0
  • Descifrando los misterios de la configuración de .NET 2.0
  • Rompiendo los misterios de la configuración de .NET 2.0

Muy recomendado, bien escrito y extremadamente útil.

Realmente no puedes cargar ningún fragmento de XML; lo que puedes cargar es un archivo de configuración completo y separado que se parece y se siente como app.config.

Si desea crear y diseñar sus propias secciones de configuración personalizadas, también debería consultar el Diseñador de secciones de configuración en CodePlex, un complemento de Visual Studio que le permite diseñar visualmente las secciones de configuración y tener todo el código de plomería necesario generado para usted.

El atributo configSource permite mover cualquier elemento de configuración a un archivo separado. En tu app.config principal harías algo como esto:

     
		      	

El siguiente código le permitirá cargar contenido de XML en objetos. Dependiendo de la fuente, app.config u otro archivo, use el cargador apropiado.

 using System.Collections.Generic; using System.Xml.Serialization; using System.Configuration; using System.IO; using System.Xml; class Program { static void Main(string[] args) { var section = SectionSchool.Load(); var file = FileSchool.Load("School.xml"); } } 

Cargador de archivos:

 public class FileSchool { public static School Load(string path) { var encoding = System.Text.Encoding.UTF8; var serializer = new XmlSerializer(typeof(School)); using (var stream = new StreamReader(path, encoding, false)) { using (var reader = new XmlTextReader(stream)) { return serializer.Deserialize(reader) as School; } } } } 

Cargador de sección:

 public class SectionSchool : ConfigurationSection { public School Content { get; set; } protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey) { var serializer = new XmlSerializer(typeof(School)); // works in 4.0 // var serializer = new XmlSerializer(type, null, null, null, null); // works in 4.5.1 Content = (Schoool)serializer.Deserialize(reader); } public static School Load() { // refresh section to make sure that it will load ConfigurationManager.RefreshSection("School"); // will work only first time if not refreshed var section = ConfigurationManager.GetSection("School") as SectionSchool; if (section == null) return null; return section.Content; } } 

Definición de datos:

 [XmlRoot("School")] public class School { [XmlAttribute("Name")] public string Name { get; set; } [XmlElement("Student")] public List Students { get; set; } } [XmlRoot("Student")] public class Student { [XmlAttribute("Index")] public int Index { get; set; } } 

Contenido de ‘app.config’

 < ?xml version="1.0"?>   

Contenido del archivo XML:

 < ?xml version="1.0" encoding="utf-8" ?>            

el código publicado se ha comprobado en Visual Studio 2010 (.Net 4.0). Funcionará en .Net 4.5.1 si cambia la construcción de seriliazer de

 new XmlSerializer(typeof(School)) 

a

 new XmlSerializer(typeof(School), null, null, null, null); 

Si la muestra provista se inicia fuera del depurador, funcionará con el constructor más simple; sin embargo, si se inicia desde VS2013 IDE con depuración, se necesitará un cambio en el constructor o bien se producirá la excepción FileNotFoundException (al menos eso fue en mi caso).