2012-10-04 39 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} 
相关问题