2015-09-24 84 views
1

我想在c#中加載一個config.xml文件,將它分成4個不同的列表。 XML文件看起來是這樣的:c#-linq to xml:讀取一個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到使這個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]); 
       } 
      } 
     } 
    } 

對不起,我的英語不好:)

+0

您已經添加了'LINQ到xml'標籤,但你沒有使用!你想要使用linq-to-xml的相應代碼嗎? –

+0

@ArghyaC是的,我想使用LINQ到XML – AnimatedPictures

+0

理想情況下,你應該嘗試一下,然後尋求幫助,如果你卡住了。但你已經得到了答案:) –

回答

4

一個簡單的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; } 
}