2012-10-04 64 views
0

我正在使用靜態類來存儲從自定義XML文件中讀取的設置的遺留應用程序。 但是,作爲對模塊進行輕微升級的一部分,客戶希望在運行時查看缺少哪些字段。
考慮以下settings.xml文件:自定義XML文件的應用程序設置,加載和錯誤處理

<?xml version="1.0" encoding="utf-8" ?> 
<appSettings> 
    <configuration> 
     <API> 
      <log> 
       <type>09</type> 
       <location>C:\Test\Test.log</filename> 
      </log> 
     </API> 
    </configuration> 
</appSettings> 

的設置使用一個XMLReader(如下所示),當前讀入靜態類:

 using (XmlTextReader xmlReader = new XmlTextReader("Settings.xml")) 
     { 
      xmlReader.ReadToFollowing("API"); 
      xmlReader.ReadToFollowing("log"); 
      xmlReader.ReadToFollowing("type"); 
      this.logtype = xmlReader.ReadElementContentAsString(); 
     //snip... 
     } 

此相同的代碼用於讀取每每一個設置。一定有更好的方法。有什麼辦法可以將XML值讀入每個相應的屬性,並且如果它爲空則會生成一個錯誤?
我試圖設計靜態設置類這樣:

public static class Settings 
    { 
     private static string logtype 

     public static string LogType 
     { 
      get 
      { return logtype; } 

      set 
      { logtype = value; } 
     } 
    } 

然後使用類似下面的「搶」的值:

public static void initSettings() 
     { 
      appSettings.LogType = read the configuration\API\log\type field from xml; 
     } 

我敢肯定,我'd只是檢查屬性構造函數中的空字符,但我怎樣才能從initSettings方法的'xml'部分讀'configuration \ API \ log \ type字段?

+0

任何原因您不僅僅是在標記爲Serializable的Settings類上使用標準XML序列化?您可能需要對空屬性進行一些額外的錯誤檢查,但這也有些微不足道。 –

+0

@WonkotheSane不幸的是,我對XML序列化的瞭解有限。你有鏈接到一個很好的教程? – TelJanini

+0

只需Google即可獲得「XML序列化C#」。如果我今晚有機會在這裏舉個例子,我會,但是網上有很多例子。 –

回答

0

您可以使用XMLDocument/XPath。像這樣的:

XmlDocument doc = new XmlDocument(); 
doc.Load("Settings.xml"); 
appSettings.LogType = doc.SelectSingleNode("/appSettings/configuration/API/log/type").InnerText; 

其實我寧願使用序列化。也許標準序列號爲YAXLib,它提供了一些有用的錯誤處理。

編輯:對我來說,它與InnerText工作。

+0

我嘗試過使用XMLDocument方法,並且無法返回XML元素中的字符串。上述代碼是否適用於您的環境? – TelJanini

+0

對不起,我現在沒有開發環境...也許你可以嘗試使用[.InnerText](http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.innertext。 aspx)而不是.Value。但是,如果上面的例子完成,它應該具有相同的效果。 – wollnyst

0

我更喜歡個人使用XmlNodeList。

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load("Settings.xml"); 
// Get element from xml. 
XmlNodeList type = xmlDoc.GetElementsByTagName("type"); 
// The following line assumes that there is only 1 type entry 
appSettings.LogType = type[0].InnerText; 

如果有多個條目想要獲取,只需要在for語句中打耳光。

for (int i = 0; i < type.Count; i++) 
{ 
    // Do stuff 
    appSettings.LogType = type[i].InnerText; 
} 
1

使用LINQ2XML..Its COOL

XELement doc=XElement.Load("yourXML.xml"); 

var LogList=doc.Descendants("configuration").Descendants("API").Descendants("log") 
.Select(x=> 
new 
{ 
type=x.Element("type").Value; 
location=x.Element("location").Value; 
} 
); 

現在你可以使用for-each循環來訪問每個日誌logList

foreach(var log in logList) 
{ 
Console.WriteLine(log.type); 
Console.WriteLine(log.location); 
} 

你也可以檢查其空

if(log.type==""){//its empty} 
相關問題