2009-09-27 45 views
1

我正在編寫一個應用程序,它有一個非常鬆散的配置文件,在啓動過程中讀入。該文件很容易解析,看起來像下面這樣:驗證一個鬆散定義的文件

tag1 = value1 
tag2 = value2 
tag3 = value3 
tag4 = value4 

帶有標籤和值是用戶可能想要配置的信息。正如我之前所說的那樣,該文件是鬆散定義的 - 也就是說,我不需要全部(或任何)字段,並且值不必按任何特定順序。唯一真正的規則是它必須採用上面的格式,任何我不認識的標籤都會被忽略。

有沒有什麼好的方法來檢查以確保文件在解析時有效,同時考慮到上述約束條件?我正在使用.NET運行時版本2.0.x的C#進行開發。謝謝。

回答

3

我建議解析文件使用正則表達式到字典中。在讀取文件之前,您可以將所有支持的密鑰的默認值添加到字典中。這樣你就可以得到一個字典,其中包含一組一致的密鑰,與文件中的密鑰無關。在這種情況下,您可能會進一步考慮添加受支持的密鑰列表,並在讀取報告不支持的密鑰的文件時根據此列表檢查每個密鑰。

const String fileName = @"foo.ini"; 

const String entryExpression = @"^\s*(?<key>[a-zA-Z][a-zA-Z0-9]*)\s*=" + 
           @"\s*(?<value>[a-zA-Z][a-zA-Z0-9]*)\s*$"; 

Dictionary<String,String> entries = new Dictionary<String, String>(); 

foreach (String line in File.ReadAllLines(fileName)) 
{ 
    Match match = Regex.Match(line, entryExpression); 

    if (match.Success) 
    { 
     String key = match.Groups["key"].Value; 
     String value = match.Groups["value"].Value; 

     if (entries.ContainsKey(key)) 
     { 
      Console.WriteLine("Overwriting the key '{0}'.", key); 
     } 

     entries[key] = value; 
    } 
    else 
    { 
     Console.WriteLine("Detected malformed entry '{0}'.", line); 
    } 
} 
+0

我喜歡你的風格:) Regex ++! – 2009-09-28 03:52:49

1

爲什麼要麻煩?

你已經說你忽略了任何無效的東西。

您可以在每行上搜索' = ',但如果無效文件無成本則看起來有點浪費。

或者,你可以放置在頂部

#footype=1 

然後一個版本只是尋找一個(通常是很好的做法,無論如何,當你改變輕微文件佈局)

0

只是隨機觀察;格式將通過python - 所以如果你想使用一些預先存在的代碼並提供更多的靈活性,你可以嵌入IronPython並使用它來解析(執行)配置文件。這會告訴你任何錯誤,並且(成功時)應該通過查找來使值可用。

可能是過度的 - 但實際上靈活的配置腳本(作爲DSL)是python的一個強項。

+3

如果第三方正在編寫這些配置(我們只能假設,如果他正在驗證它們),這並不是完全明智的;嵌入像這樣的編譯器將有效地允許它們進入他的應用程序的上下文並執行任務。 – 2009-09-28 03:52:44

+0

執行配置文件.....不知何故,這聽起來像一個壞主意給我。 – mpen 2009-09-28 03:53:47

+0

也不完全瘋狂 - 當然不是聞所未聞的;這一切都取決於你相信多少輸入。如果你願意,你可以通過濫用app.config來做一些非常瘋狂的事情。如果你可以控制配置,你已經比你想要保護的系統更強大了...... – 2009-09-28 05:13:43