2012-01-04 37 views
8

Tôi có một tệp XML, tôi có một nút và tôi đã đọc tất cả các ChildNodes. Tên của childNode khớp với một biến tôi phải thiết lập với giá trị của childNode này.Chuyển đổi chuỗi thành tên biến

Trong vòng lặp, tôi muốn thiết lập:

  • myvar1 để MyValue1
  • myvar2 để MyValue2

C# Code:

protected string myvar1; 
protected string myvar2; 

XML nội dung nhìn như thế này:

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

C# biến thiết lập:

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

Bất kỳ ý tưởng?

Cảm ơn,

UPDATE 1: giá trị "lĩnh vực" trong vòng lặp là null tất cả các thời gian.

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

Không thể bạn chỉ cần sử dụng 'XmlSerializer' để làm điều này? Nó hiệu quả hơn việc sử dụng phản chiếu thủ công. – Groo

Trả lời

7

Bạn có thể làm điều đó bằng Reflection:

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

RE: UPDATE 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

Bạn có thể nhìn vào update1, cảm ơn. –

+0

Đầu tiên: Tên nút xml của bạn không khớp với tên thuộc tính bao gồm cả trường hợp nhạy cảm. Thứ hai: bạn đang sử dụng các thuộc tính, vì vậy bạn cần phải gọi 'GetProperty' thay vì' GetField'. – Samich

+2

Tôi đã thêm mẫu làm việc. – Samich

5

Nếu bạn đang tìm cách gán biến dựa trên tên của các nút trong XML, bạn có ít nhất một vài lựa chọn:

  • Deserialize sự Cấu trúc XML thành đối tượng có tên thành viên tương ứng
  • Điền các biến bằng cách sử dụng phản chiếu
  • Điền các biến bằng cách sử dụng các method gọi/biểu thức động mà biết cách đọc nội dung của nút XML vào một thuộc tính đối tượng.

Tất cả các phương pháp này đều đề xuất một cách tiếp cận hướng đối tượng hơn cho vấn đề, sau đó chỉ cần nhập một vài biến, nhưng sẽ dễ dàng tạo cấu trúc gọn nhẹ với các thành viên thích hợp được đọc bằng tài liệu XML.

Bạn cũng có thể sử dụng bộ sưu tập dựa trên khóa (như Dictionary<string, string>) để lưu trữ các giá trị nếu bạn chỉ đang tìm cách xây dựng một bộ sưu tập tên/giá trị đơn giản từ XML nguồn.

2

Bạn có thể có thể làm là "mặc định" cho biết, hoặc bạn có thể nhìn vào Reflection. Bằng cách sử dụng phương thức Type.GetMember(string), bạn có thể tìm thấy một thành viên có tên đã cho (tên thẻ trong XML của bạn) và đặt giá trị của nó.

EDIT
Samich đánh tôi, vì vậy tôi sẽ cho anh ta 1 - anh ấy có mẫu mã là tốt.

3

Nếu bạn đặt tên và các giá trị trong một cuốn từ điển, bạn có thể dễ dàng nhận được các giá trị theo tên:

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

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

Tôi không muốn thiết lập từng cái một (nếu có thể) –

+0

Vâng, bạn có thể làm điều đó bằng cách sử dụng sự hoàn hảo, nhưng tôi muốn đưa ra một giải pháp thay thế mà không phản ánh. Bên cạnh đó, cách này * bạn * kiểm soát các thuộc tính nào được đặt, chứ không phải nội dung của tệp XML. – Guffa

Các vấn đề liên quan