我正在使用一个遗留应用程序,该应用程序使用静态类来存储从自定义XML文件中读取的设置。 但是,作为对模块的轻微升级的一部分,客户希望在运行时看到缺少哪些字段 请考虑以下Settings.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值读入每个相应的属性,如果它是null,则生成错误? 我正在尝试设计静态Settings类:
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;
}
我很确定我只是检查属性构造函数中的空字符,但是如何从initlltings方法的xml'读取配置\ API \ log \ type字段?< / p>
答案 0 :(得分: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}
答案 1 :(得分:0)
您可以使用XMLDocument / XPath。像这样:
XmlDocument doc = new XmlDocument();
doc.Load("Settings.xml");
appSettings.LogType = doc.SelectSingleNode("/appSettings/configuration/API/log/type").InnerText;
其实我更喜欢使用序列化。也许是标准序列化YAXLib,它提供了一些有用的错误处理。
编辑:对我而言,它正在使用InnerText。
答案 2 :(得分: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;
}