2012-01-04 90 views
8

我有一個XML文件,我有一個節點,並且我讀取了所有的ChildNodes。 childNode的名稱與我必須用此childNode的值設置的變量相匹配。將字符串轉換爲變量名稱

在循環中,我想設置:

  • myvar1到MyValue1
  • myvar2到MyValue2

C#代碼:

protected string myvar1; 
protected string myvar2; 

XML內容的樣子像這樣:

<parameters> 
<myvar1>MyValue1</myvar1> 
<myvar2>MyValue2</myvar2> 
</parameters> 

C#設置變量:

foreach (var item in xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes) 
    { 
     ?????? 
    } 

任何想法?

感謝,

更新1: 在循環值 「場」 是空所有的時間。

public class ParametersTest 
{ 
    public string myvar1 { get; set; } 
    public string myvar2 {get; set;} 
} 

var type = typeof(ParametersTest); 
foreach (XmlNode item in xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes) 
{ 

    var field = type.GetField(item.LocalName); 
    field.SetValue(field, item.InnerText); 
} 
+0

不能你只需要使用'XmlSerializer'做到這一點?它比手動使用反射效率更高。 – Groo 2012-01-04 09:39:27

回答

7

可以使用Reflection做到這一點:

var type = typeof(SomeClass); 
var field = type.GetField(item.Name); 
field.SetValue(null, item.InnerText); 

RE:更新1

var parameters = new ParametersTest(); 
var type = parameters.GetType(); 

var s = @"<parameters> 
      <MyVar1>MyValue1</MyVar1> 
      <MyVar2>MyValue2</MyVar2> 
      </parameters>"; 

var xmlParamInstallation = new XmlDocument(); 
xmlParamInstallation.LoadXml(s); 

foreach (XmlNode item in xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes) 
{ 

    var field = type.GetProperty(item.LocalName); 
    field.SetValue(parameters, item.InnerText, null); 
} 
+0

你可以看看update1,謝謝。 – 2012-01-04 08:54:47

+0

首先:您的XML節點名稱與屬性名稱(包括區分大小寫)不匹配。第二:你正在使用屬性,所以你需要調用'GetProperty'而不是'GetField'。 – Samich 2012-01-04 08:59:41

+2

我已添加工作示例。 – Samich 2012-01-04 09:02:40

5

如果您正在尋求基於在XML節點的名稱變量賦值,你至少有幾個選項:

  • 反序列化將XML結構轉換爲具有相應成員名稱的對象
  • 使用反射填充變量
  • 填充變量使用知道如何將XML節點的內容讀入對象屬性的動態方法調用/表達式樹。

所有這些方法提出一個更加面向對象的方法解決問題然後就填充了幾個變量,但它會很容易地創建一個輕量結構,這是通過讀取XML文檔填充相應的成員。

如果您只是想從源XML構建一個簡單的名稱/值集合,您還可以使用基於密鑰的集合(如Dictionary<string, string>)來存儲這些值。

2

你既可以做的 「默認」 說,或者你可以看看反思。通過使用Type.GetMember(string)方法,您可以找到具有給定名稱(XML中的標記名稱)的成員並設置其值。

編輯
Samich打我,讓我給他打+1 - 他有樣本代碼。

3

如果你把名字和值在字典中,你可以很容易地通過名稱獲取值:

Dictionary<string, string> parameters = 
    xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes 
    .ToDictionary(n => n.Name, n => n.InnerText); 

myvar1 = parameters["myvar1"]; 
myvar2 = parameters["myvar2"]; 
+0

我不想一個一個地設置變量(如果可能的話) – 2012-01-04 08:51:07

+0

那麼,你可以使用reflecction來做到這一點,但我喜歡給出一個沒有反思的替代方案。此外,這種方式*您*控制設置哪些屬性,而不是XML文件的內容。 – Guffa 2012-01-04 09:23:33