Во-первых, не нужно пересоздавать список в цикле. Вы уже создали список в начале метода - вот его и используйте, иначе в каждом найденном элементе xml-документа затираются ранее найденные элементы (разве что вы так и хотите сделать, и то - лучше сделать это по другому). Уберите list = new List(); в цикле.
Во-вторых, вы уверены, что "Ссылка на объект не указывает на экземпляр объекта" - проблема с DbConf[0], а не с logger? Или, скорее, проблема в самом методе. Например, в n.SelectSingleNode("server").InnerText - и правда есть элемент "server"?. Потому что этот код метода выглядит как правильный.
Поставьте брейкпоинт в метод, и посмотрите по шагам, где именно возникает исключение.
Ну и в-третьих, названия методов принято называть, начиная с глагола. Метод (функция) - это действие с данным, а не данные. Назовите метод ReadXml().
UPD. но как мне обратиться из любого места программы к данным?
Сколько у вас конфигов? Больше одного? ведь у вас список, значит, нужно выбирать конкретный конфиг:
var configs = DbConfig.GetDbConf();
Console.WriteLine("{0} {1}", c[0].Server, c[0].Port);
А если вы знаете имя сервера, то используйте словарь вместо списка:
public static Dictionary<string, DbConf> GetDbConf()
{
try
{
var configs = new Dictionary<string, DbConf>();
// ...
foreach (XmlNode n in xml.SelectNodes(Properties.Settings.Default.setting_node))
{
string server = n.SelectSingleNode("server").InnerText;
configs.Add(server, new DbConf
{
Server = server,
Port = n.SelectSingleNode("port").InnerText,
User = n.SelectSingleNode("user_id").InnerText,
Pass = n.SelectSingleNode("password").InnerText,
Db = n.SelectSingleNode("database").InnerText
});
};
return list;
}
catch (Exception msg)
{
logger.Debug(msg);
return null;
}
}
var configs = DbConfig.GetDbConf();
var serverName = "localhost";
var config = configs[serverName];
Console.WriteLine("{0} {1}", config.Server, config.Port);
И сделайте в классе более типизированные поля - Port и User можно сделать int (тогда уж не User, а UserId).