使用 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部分。

使用 System.XML 命名空间读取 xml 文件

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.Linqusing System.Xml.Linq才能使其正常工作。

但说实话:你应该使用 AppSettings ,因为它是为此而设计的。

让我解释一下为什么手动解析 appSettings 不是好主意。除了add元素之外,appSettings还可以包含clearremove元素,这些元素会影响先前定义的设置。因此,以下部分:

<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)属性。

如果查看代码,则会正确读取驱动程序值作为属性,但未对其他两个节点执行此操作。您仍然会遇到基于索引而不是属性名称检索属性的问题。使用该名称是一种更稳定的解析技术。