2012-01-04 2 views
8

У меня есть XML-файл, у меня есть узел, и я читаю все дочерние узлы. Имя childNode соответствует переменной, которую я должен установить со значением этого дочернегоNode.Преобразование строки в переменное имя

В цикле, я хотел бы установить:

  • 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) 
    { 
     ?????? 
    } 

Любая идея?

Спасибо,

UPDATE 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

ответ

7

Вы можете сделать это с помощью 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

Не могли бы вы посмотреть update1, спасибо. –

+0

Первое: имена узлов xml не соответствуют именам свойств, включая чувствительность к регистру. Во-вторых: вы используете свойства, поэтому вам нужно вызвать 'GetProperty' вместо' GetField'. – Samich

+2

Я добавил рабочий образец. – Samich

5

Если вы ищете, чтобы назначить переменные на основе имен узлов в XML, то есть по крайней мере, параметры пара:

  • десериализации XML-структура в объект с соответствующими именами-членами
  • Заполнение переменных с помощью отражения
  • Заполнение переменных используя динамические вызовы методов/деревья выражений, которые знают, как читать содержимое узла XML в свойстве объекта.

Все эти подходы предполагают более объектно-ориентированный подход к проблеме, а затем просто заполнение нескольких переменных, но было бы легко создать легкую структуру с соответствующими членами, заполненными чтением XML-документа.

Вы также можете использовать коллекцию на основе ключа (например, Dictionary<string, string>) для хранения значений, если вы просто хотите создать простую коллекцию имен и значений из исходного XML.

2

Вы можете либо сделать, как "По умолчанию", сказал, или вы можете взглянуть на отражение. Используя метод Type.GetMember(string), вы можете найти член с заданным именем (имя тега в вашем XML) и установить его значение.

EDIT
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

Я не хочу, чтобы заданная переменная одна за другой (если возможно) –

+0

Ну, вы можете сделать это с помощью reflecction, но мне нравится давать альтернативу без отражения. Кроме того, таким образом * вы * контролируете, какие свойства заданы, а не содержимое файла XML. – Guffa