【问题标题】:c# - linq to xml: read a xml config filec# - linq to xml:读取一个xml配置文件
【发布时间】:2015-09-24 10:04:18
【问题描述】:

我想在 c# 中加载一个 config.xml 文件并将其拆分为 4 个不同的列表。 XML 文件如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configs version="1.0" author="AP">
        <config ver="9.7">
            <start>00090[ABCDEF].*</start>
            <lines>544</lines>
            <configFile>cfg_9_7.xml</configFile>
        </config>
        <config ver="9.7_512">
            <start>00090[1-9].*</start>
            <lines>512</lines>
            <configFile>cfg_9_7_v2_512.xml</configFile>
        </config>
        <config ver="9.7">
            <start>00090[2-7].*</start>
            <lines>256</lines>
            <configFile>cfg_9_7_small.xml</configFile>
        </config>
    </Configs>

我需要拆分配置的版本 (config ver="...")、开始、行和 configFile。所有列表都可以保存字符串,所以我只需要值和属性。我想用 Linq to XML 来做这个,因为我认为它比我的“阅读所有行并搜索关键字”功能更快更小:

    var cfg = File.ReadAllLines(folder + keyCfg);
    List<String> config = new List<String>(cfg);
    Boolean keyFormatConfig = false;
    for (int i = 0; i < config.Count; i++)
    {
        String line = config[i];
        while (line.StartsWith(" ") || line.StartsWith("\t"))
        {
            line = line.Substring(1);
        }
        if (line.StartsWith("<config ver=\""))
        {
            keyFormatConfig = true;
        }
        if (line.StartsWith("</config>"))
        {
            keyFormatConfig = false;
        }
        if (keyFormatConfig)
        {
            if (line.StartsWith("<config ver=\""))
            {
                String[] name = line.Split('"');
                if (name.Length >= 2)
                {
                    Version.Add(name[1]);
                }
            }
            else if (line.StartsWith("<start>"))
            {
                line = line.Substring(7);
                if (line.Contains("<"))
                {
                    String[] value = line.Split('<');
                    Start.Add(value[0]);
                }
            }
            else if (line.StartsWith("<lines>"))
            {
                line = line.Substring(7);
                if (line.Contains("<"))
                {
                    String[] value = line.Split('<');
                    Lines.Add(value[0]);
                }
            }
            else if (line.StartsWith("<configFile>"))
            {
                line = line.Substring(12);
                if (line.Contains("<"))
                {
                    String[] value = line.Split('<');
                    ConfigFile.Add(value[0]);
                }
            }
        }
    }

对不起我的英语不好:)

【问题讨论】:

  • 您添加了linq-to-xml 标签,但您没有使用它!要不要使用 linq-to-xml 对应的代码?
  • @ArghyaC 是的,我想使用 linq to xml
  • 理想情况下,您应该尝试一下,然后在遇到困难时寻求帮助。但是你已经得到了答案:)
  • @ArghyaC 我尝试了很多,但每次都失败了

标签: c# xml linq linq-to-xml


【解决方案1】:

一个简单的 LINQ:

void Main()
{
    var configFile = @"c:\temp\so\config.xml";
    var xdoc = XDocument.Load(configFile);
    var configs = xdoc.Element("Configs").Elements("config");
    foreach (var c in configs)
    {
        Console.WriteLine (c.Attribute("ver").Value);
        Console.WriteLine ("Start {0}",c.Element("start").Value);
    }
}

运行它会产生

9.7
Start 00090[ABCDEF].*
9.7_512
Start 00090[1-9].*
9.7
Start 00090[2-7].*

【讨论】:

    【解决方案2】:

    你可以像这样使用XDocument

    XDocument doc = XDocument.Load(yourFile);
    
    var configs = doc.Descendants("config").Select(i => new Config()
    {
        Version = i.Attribute("ver").Value,
        Start = i.Element("start").Value,
        Lines = i.Element("lines").Value,
        ConfigFile = i.Element("configFile").Value,
    }).ToList();
    

    这里是Config

    public class Config
    {
        public string Start { get; set; }
    
        public string Lines { get; set; }   //Also you may want to use int
    
        public string ConfigFile { get; set; }
    
        public string Version { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多