【问题标题】:Application settings fom custom XML file, loading and error-handling自定义 XML 文件的应用程序设置、加载和错误处理
【发布时间】:2012-10-05 14:17:38
【问题描述】:

我正在开发一个遗留应用程序,它使用静态类来存储从自定义 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 值读入每个相应的属性,如果它为空则生成错误?
我正在尝试这样设计静态设置类:

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;
        }

我很确定我只是在属性构造函数中检查空字符,但是我将如何执行 initSettings 方法的“从 xml 读取 configuration\API\log\type 字段”部分?

【问题讨论】:

  • 您不只是在标记为可序列化的设置类上使用标准 XML 序列化的任何原因?您可能需要对 null 属性进行一些额外的错误检查,但这也有些微不足道。
  • @WonkotheSane 不幸的是,我对 XML 序列化的了解有限。你有一个好的教程的链接吗?
  • 只是谷歌的“XML 序列化 C#”。如果今晚晚些时候我有机会在这里举个例子,我会的,但是网上有很多例子。
  • xml 日志是否只包含 1 个日志

标签: c# .net xml


【解决方案1】:

使用 LINQ2XML..它的 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}

【讨论】:

    【解决方案2】:

    您可以使用 XMLDocument / XPath。像这样的:

    XmlDocument doc = new XmlDocument();
    doc.Load("Settings.xml");
    appSettings.LogType = doc.SelectSingleNode("/appSettings/configuration/API/log/type").InnerText;
    

    其实我更喜欢使用序列化。也许标准序列化为YAXLib,它提供了一些有用的错误处理。

    编辑:对我来说,它正在使用 InnerText。

    【讨论】:

    • 我尝试使用 XMLDocument 方法,但无法返回 XML 元素中的字符串。上面的代码在你的环境中工作吗?
    • 对不起,我现在没有开发环境...也许你可以尝试使用.InnerText而不是.Value。但是如果上面的例子完整的话,应该也是一样的效果。
    【解决方案3】:

    我个人更喜欢使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多