2014-02-21 21 views
3

C#解析簡單的XML文件,我有這個很簡單的XML文件:與LINQ

<?xml version="1.0" encoding="UTF-8"?> 
<ConfigurationFile> 
    <ConfigurationFilePath>Test1</ConfigurationFilePath> 
    <ConnectionString>Test2</ConnectionString> 
    <AnalyzeFilePath>Test3</AnalyzeFilePath> 
</ConfigurationFile> 

我想每個字段的信息。 但這並不顯示任何東西..

這裏是我的C#代碼隱藏:

private void ParseXMLFile() 
{ 
    Console.WriteLine("Parse"); 
    if (configurationPAthFileTextbox.Text != null) 
    { 
     Console.WriteLine("file != null"); 
     try 
     { 
      XElement main = XElement.Load(configurationPAthFileTextbox.Text); 

      var results = main.Descendants("ConfigurationFile") 
          .Select(e => new { ConfigurationFilePath = e.Descendants("ConfigurationFilePath").FirstOrDefault().Value, 
            ConnectionString = e.Descendants("ConnectionString").FirstOrDefault().Value }); 

      foreach (var result in results) 
       Console.WriteLine("{0}, {1}", result.ConfigurationFilePath, result.ConnectionString); 
      Console.ReadLine(); 

     } 
     catch (Exception e) 
     { 
      Debug.WriteLine(e.ToString()); 
     } 
    } 
} 

回答

11
  1. 加載它爲XDocument,因爲它是一個文件,而不是元素。

    var xDoc = XDocument.Load(configurationPAthFileTextbox.Text); 
    
  2. 您可以輕鬆地元素名稱作爲鍵和元素值將文檔轉換爲Dictionary<string, string>作爲值:

    var results = xDoc.Root 
            .Elements() 
            .ToDictionary(e => e.Name, e => (string)e); 
    
  3. 要打印ConfigurationFilePathConnectionString

    Console.WriteLine("{0}, {1}", results["ConfigurationFilePath"], results["ConnectionString"]); 
    

    打印Test1, Test2

+0

+1:非常有用的,從來沒有使用ToDictionary – evanb

1

首先,創建一個類來表示您的XML文件中包含的感興趣的信息。定義從XML文件中提取感興趣的值,並將它們映射到類的屬性構造函數:

public class ConfigurationFile 
{ 
    public String ConfigurationFilePath { get; set; } 
    public String ConnectionString { get; set; } 
    public String AnalyzeFilePath { get; set; } 

    public ConfigurationFile(String xmlFilePath) 
    { 
     XDocument document = XDocument.Load(xmlFilePath); 
     var root = document.Root; 

     ConfigurationFilePath = (string)root.Element("ConfigurationFilePath"); 
     ConnectionString = (string)root.Element("ConnectionString"); 
     AnalyzeFilePath = (string)root.Element("AnalyzeFilePath"); 
    } 
} 

一旦你創建了這個類有其特殊的構造,利用類的非常簡單:

var configFile = new ConfigurationFile(xmlFilePath); 

var path = configFile.ConfigurationFilePath; 
var connectString = configFile.ConnectionString; 
var analyzeFilePath = configFile.AnalyzeFilePath; 

下面是將所有這些集成的演示程序。 (請注意,在構造函數中加載從一個字符串,而不是從文件的XML這個演示程序,如上圖所示)。

using System; 
using System.Xml; 
using System.Xml.Linq; 

class LinqToXmlDemo 
{ 
    static public void Main(string[] args) 
    { 
     string xmlContent = GetXml(); 
     var configFile = new ConfigurationFile(xmlContent); 

     Console.WriteLine 
      ("ConfigurationFilePath:[{0}]\n" + 
      "ConnectionString:[{1}]\n" + 
      "AnalyzeFilePath:[{2}]\n--", 
      configFile.ConfigurationFilePath, 
      configFile.ConnectionString, 
      configFile.AnalyzeFilePath); 
    } 

    static string GetXml() 
    { 
     return 
      @"<?xml version='1.0' encoding='UTF-8'?> 
       <ConfigurationFile> 
        <ConfigurationFilePath>Test1</ConfigurationFilePath> 
        <ConnectionString>Test2</ConnectionString> 
        <AnalyzeFilePath>Test3</AnalyzeFilePath> 
       </ConfigurationFile>"; 
    } 
} 

public class ConfigurationFile 
{ 
    public String ConfigurationFilePath { get; set; } 
    public String ConnectionString { get; set; } 
    public String AnalyzeFilePath { get; set; } 

    public ConfigurationFile(String xml) 
    { 
     XDocument document = XDocument.Parse(xml); 
     var root = document.Root; 

     ConfigurationFilePath = (string)root.Element("ConfigurationFilePath"); 
     ConnectionString = (string)root.Element("ConnectionString"); 
     AnalyzeFilePath = (string)root.Element("AnalyzeFilePath"); 
    } 
} 

期望輸出

ConfigurationFilePath:[Test1] 
ConnectionString:[Test2] 
AnalyzeFilePath:[Test3] 
--