使用 System.XML 命名空间读取 xml 文件
本文关键字:xml 文件 读取 命名空间 System XML 使用 | 更新日期: 2023-09-27 18:30:38
我想使用我自己的xml代码(不是linq to xml)读取App.config
文件的<appSettings>
部分:
这是我的应用程序.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
部分。
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
,因为它是为此而设计的。
让我解释一下为什么手动解析 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>
您将只为应用程序定义一个设置(间隔)。如果你尝试获取所有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
已经在这里,它可以正确解析应用程序设置。以下代码将打印出单个间隔设置:
foreach(string key in ConfigurationManager.AppSettings)
Console.WriteLine("{0}: {1}", key, settings[key]);
另请记住,应用程序的实际设置也将包含machinne.config
文件中的设置。 ConfigurationManager
也会为你获取这些设置。
如果只想读取 app.config 设置,请使用配置管理器。如果您正在尝试学习如何使用 XmlDocument,则会遇到一些问题。
1)在一般情况下,您确实不应该依赖于XML文档中节点的顺序,如果您根据XML内容进行解析,您将获得更稳定的代码。这不是你的实际问题。
2) Considering the node <add key="daysToExpire" value="0"/>
这实际上是一个 XmlElement 节点。它包含 2 个 XmlAttribute 节点。它没有值。实际上,en XmlElement 节点从来没有一个值(.值属性将始终为空值)。XmlElement 中的"值"将是 。内部文本(或 .InnerXml)属性。
如果查看代码,则会正确读取驱动程序值作为属性,但未对其他两个节点执行此操作。您仍然会遇到基于索引而不是属性名称检索属性的问题。使用该名称是一种更稳定的解析技术。