我想使用自己的xml代码(不是linq到xml)读取<appSettings>
文件的App.config
部分:
这是我的app.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="driver" value="C:/"/>
<add key="daysToExpire" value="0"/>
<add key="Interval" value="5000"/>
</appSettings>
<system.net>
<mailSettings >
<smtp>
<network enableSsl="false"
port="25"
host="smtp.gmail.com"
defaultCredentials="false"
/>
</smtp>
</mailSettings>
</system.net>
我的c#代码:
XmlDocument doc = new XmlDocument();
doc.Load(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.xml")
);
XmlNodeList appSettings = doc.SelectNodes("/configuration/appSettings/add");
Driver = appSettings[0].Attributes[0].Value;
Interval = Convert.ToInt16(appSettings[2].Value);
DaysToExpire = Convert.ToInt16(appSettings[1].Value);
appSettings
有3种模式,但我无法访问每种模式。
我还想阅读system.net
部分。
答案 0 :(得分:2)
LINQ to XML 方式:
var xDoc = XDocument.Load("Input.txt");
var appSettings = xDoc.Root.Element("appSettings");
var driver = (string)appSettings.Elements("add")
.First(x => (string)x.Attribute("key") == "driver")
.Attribute("value");
var daysToExpire = (string)appSettings.Elements("add")
.First(x => (string)x.Attribute("key") == "daysToExpire")
.Attribute("value");
var interval = (string)appSettings.Elements("add")
.First(x => (string)x.Attribute("key") == "Interval")
.Attribute("value");
您需要文件顶部的using System.Linq
和using System.Xml.Linq
才能使其正常运行。
但说实话:你应该使用AppSettings
,因为它是为此设计的。
答案 1 :(得分:2)
让我解释为什么手动解析appSettings并不是一个好主意。除了add
元素appSettings
可以包含clear
和remove
元素,这会影响以前定义的设置。因此,请参阅以下部分:
<appSettings>
<add key="driver" value="C:/"/>
<clear/>
<add key="daysToExpire" value="0"/>
<add key="Interval" value="5000"/>
<remove key="daysToExpire"/>
</appSettings>
您只需为应用程序定义一个设置( Interval )。如果您尝试获取所有add
元素,则会得到不正确的设置(所有三个元素都将出现在字典中):
var configPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
var xdoc = XDocument.Load(configPath);
var appSettings = xdoc.Root.Element("appSettings").Elements("add")
.ToDictionary(a => (string)a.Attribute("key"),
a => (string)a.Attribute("value"));
正确的解析将如下所示:
var appSettings = new Dictionary<string, string>();
foreach(var e in xdoc.Root.Element("appSettings").Elements())
{
switch(e.Name.LocalName)
{
case "add":
appSettings.Add((string)e.Attribute("key"),
(string)e.Attribute("value"));
break;
case "clear":
appSettings.Clear();
break;
case "remove":
appSettings.Remove((string)e.Attribute("key"));
break;
}
}
另一方面,ConfigurationManager
已经在这里,它可以正确解析应用程序设置。以下代码将打印出单个 Interval 设置:
foreach(string key in ConfigurationManager.AppSettings)
Console.WriteLine("{0}: {1}", key, settings[key]);
另请注意,应用程序的实际设置还将包含machinne.config
文件中的设置。 ConfigurationManager
也会为您获取这些设置。
答案 2 :(得分:0)
如果您只想阅读app.config设置,请使用配置管理器。如果您正在尝试学习如何使用XmlDocument,那么您会遇到一些问题。
1)在一般情况下,您确实不应该依赖XML文档中节点的顺序,如果根据XML内容进行解析,则可以获得更稳定的代码。这不是你的实际问题。
2) Considering the node <add key="daysToExpire" value="0"/>
这实际上是一个XmlElement节点。它包含2个XmlAttribute节点。它没有价值。实际上,en XmlElement节点永远不会有值(.Value属性将始终为null)。 XmlElement中的“值”将是.InnerText(或.InnerXml)属性。
如果查看代码,则可以正确读取驱动程序值作为属性,但是其他两个节点没有这样做。您仍然存在基于索引而不是属性名称检索属性的问题。使用该名称是一种更稳定的解析技术。