2013-09-09 5 views
0

Я хочу, чтобы прочитать <appSettings> раздел файла App.config, используя свой собственный код XML (не Linq для XML):чтения файла XML с помощью System.XML имен

Вот моя app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<appSettings> 
    <add key="driver" value="C:/"/> 
    <add key="daysToExpire" value="0"/> 
    <add key="Interval" value="5000"/> 
</appSettings> 
<system.net> 
    <mailSettings > 
     <smtp> 
      <network enableSsl="false" 
        port="25" 
        host="smtp.gmail.com" 
        defaultCredentials="false" 
        /> 

     </smtp> 
    </mailSettings> 
</system.net> 

Мой C# код:

XmlDocument doc = new XmlDocument(); 
doc.Load(
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.xml") 
); 

XmlNodeList appSettings = doc.SelectNodes("/configuration/appSettings/add"); 

Driver = appSettings[0].Attributes[0].Value; 
Interval = Convert.ToInt16(appSettings[2].Value); 
DaysToExpire = Convert.ToInt16(appSettings[1].Value); 

appSettings имеет 3 режима, но мне не удалось получить доступ к каждому из них.

Я также хочу прочитать раздел system.net.

+1

Вам не нравится ConfigurationManager.AppSettings? – Kurubaran

+0

Да, но я предпочитаю использовать этот способ для изучения чтения xml. – anmarti

+1

@senyorToni Думаю, теперь лучше изучить чтение xml с помощью LINQ. XmlDocument был интересен для изучения десять лет назад. Также AccessDenied прав - лучше использовать ConfigurationManager для таких задач –

ответ

1

LINQ к XML образом:

var xDoc = XDocument.Load("Input.txt"); 

var appSettings = xDoc.Root.Element("appSettings"); 
var driver = (string)appSettings.Elements("add") 
           .First(x => (string)x.Attribute("key") == "driver") 
           .Attribute("value"); 
var daysToExpire = (string)appSettings.Elements("add") 
             .First(x => (string)x.Attribute("key") == "daysToExpire") 
             .Attribute("value"); 
var interval = (string)appSettings.Elements("add") 
            .First(x => (string)x.Attribute("key") == "Interval") 
            .Attribute("value"); 

Вам нужно using System.Linq и using System.Xml.Linq в верхней части файла, чтобы сделать его работу.

Но если честно: , вы должны использовать AppSettings, потому что он предназначен для этого.

2

Позвольте мне объяснить, почему парсинг appSettings вручную не очень хорошая идея. Кроме того, add элементы appSettings могут содержать clear и remove элементы, которые влияют на ранее определенные настройки. Так, с следующим разделом:

<appSettings> 
    <add key="driver" value="C:/"/> 
    <clear/> 
    <add key="daysToExpire" value="0"/>  
    <add key="Interval" value="5000"/> 
    <remove key="daysToExpire"/> 
</appSettings> 

Вы будете иметь только один параметр (интервала), определенный для вашего приложения. Если вы будете пытаться получить все add элементы, вы получите неправильные настройки (все три элемента будут в словаре):

var configPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
var xdoc = XDocument.Load(configPath); 
var appSettings = xdoc.Root.Element("appSettings").Elements("add") 
         .ToDictionary(a => (string)a.Attribute("key"), 
            a => (string)a.Attribute("value")); 

Правильный разбор будет выглядеть следующим образом:

var appSettings = new Dictionary<string, string>(); 
foreach(var e in xdoc.Root.Element("appSettings").Elements()) 
{ 
    switch(e.Name.LocalName) 
    { 
     case "add": 
      appSettings.Add((string)e.Attribute("key"), 
          (string)e.Attribute("value")); 
      break; 
     case "clear": 
      appSettings.Clear(); 
      break; 
     case "remove": 
      appSettings.Remove((string)e.Attribute("key")); 
      break; 
    } 
} 

О рынке другой рукой, ConfigurationManager уже здесь, и он может правильно анализировать настройки приложения. Следующий код выведет одного Interval установка:

foreach(string key in ConfigurationManager.AppSettings) 
    Console.WriteLine("{0}: {1}", key, settings[key]); 

Также имейте в виду, что фактические параметры вашего приложения также будет содержать параметры из machinne.config файла. ConfigurationManager также получит эти настройки для вас.

0

Если вы просто хотите прочитать настройки app.config, используйте диспетчер конфигурации. Если вы пытаетесь научиться использовать XmlDocument, у вас есть несколько проблем.

1) Вы действительно не должны зависеть от порядка узлов в документе XML в общем случае, у вас есть более стабильный код, если вы анализируете в зависимости от содержимого XML. Это не ваша настоящая проблема.

2) Considering the node <add key="daysToExpire" value="0"/> 

Это фактически узел XmlElement. Он содержит 2 узла XmlAttribute. Он не имеет значения. На самом деле, узел XmlElement никогда не имеет значения (свойство .Value всегда равно null). «Значение» в XmlElement будет свойством .InnerText (или .InnerXml).

Если вы посмотрите на свой код, вы правильно прочитали значение драйвера в качестве атрибута, но вы не сделали этого для двух других узлов. У вас по-прежнему возникает проблема получения атрибута на основе индекса вместо имени атрибута. Использование имени - более стабильная методика синтаксического анализа.

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