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

时间:2013-09-09 16:28:02

标签: c# .net xml system.xml

我想使用自己的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部分。

3 个答案:

答案 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.Linqusing System.Xml.Linq才能使其正常运行。

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

答案 1 :(得分:2)

让我解释为什么手动解析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>

您只需为应用程序定义一个设置( 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)属性。

如果查看代码,则可以正确读取驱动程序值作为属性,但是其他两个节点没有这样做。您仍然存在基于索引而不是属性名称检索属性的问题。使用该名称是一种更稳定的解析技术。