2012-01-04 15 views
8

Tengo un archivo XML, tengo un nodo y leo todos ChildNodes. El nombre del childNode coincide con una variable que debo establecer con el valor de este childNode.Convertir cadena a nombre de variable

En el bucle, me gustaría establecer:

  • MyVar1 a MyValue1
  • myvar2 a MyValue2

El código C#:

protected string myvar1; 
protected string myvar2; 

El XML contenidos mirada de esta manera:

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

C# las variables de ajuste:

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

alguna idea?

Gracias,

Update 1: el valor "campo" en el bucle es nulo todo el tiempo.

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

No se pudo que acaba de usar 'XmlSerializer' para hacer esto? Es más eficiente que usar la reflexión manualmente. – Groo

Respuesta

7

Puede hacerlo utilizando 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

¿Podría mirar la actualización1, gracias? –

+0

Primero: sus nombres de nodo xml no coinciden con los nombres de propiedades, incluida la distinción entre mayúsculas y minúsculas. Segundo: está usando propiedades, por lo que debe llamar a 'GetProperty' en lugar de' GetField'. – Samich

+2

He agregado una muestra de trabajo. – Samich

5

Si usted está tratando de asignar variables en base a los nombres de nodos en XML, que tiene por lo menos una opciones par:

  • deserializar el Estructura XML en un objeto con los nombres de miembros correspondientes
  • Llena las variables usando la reflexión
  • Rellenar las variables utilizando árboles de llamadas/expresiones de métodos dinámicos que saben cómo leer los contenidos del nodo XML en una propiedad del objeto.

Todos estos enfoques sugieren un enfoque más orientado a objetos para el problema a continuación, sólo poblar algunas variables, pero sería fácil de crear una estructura ligera con los miembros apropiados que está poblada por la lectura del documento XML.

También podría utilizar una colección basada en claves (como Dictionary<string, string>) para almacenar los valores si solo está buscando construir una colección simple de nombre/valor desde el código fuente XML.

2

Usted podría hacer como "defecto" Dicho esto, o usted podría mirar en la reflexión. Al usar el método Type.GetMember(string), puede encontrar un miembro con el nombre de pila (el nombre de la etiqueta en su XML) y establecer su valor.

EDITAR
Samich me golpeaba, así le daré 1 - que tiene código de ejemplo también.

3

Si pones los nombres y valores en un diccionario, se puede conseguir fácilmente los valores por nombre:

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

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

No quiero establecer la variable una por una (si es posible) –

+0

Bueno, puedes hacerlo usando la reflexión, pero me gusta dar una alternativa sin reflexión. Además, de esta manera * usted * controla qué propiedades están establecidas, no el contenido del archivo XML. – Guffa

Cuestiones relacionadas