Graficas_Funcs.cs
1 using System;
2 using System.IO;
3 using System.Data;
4 using System.Collections;
5 using System.Collections.Generic;
6 using System.Text;
7 using System.Xml;
8 
9 namespace sage.ew.graficas.clases
10 {
14  public class Graficas_Funcs
15  {
26  public void Leer_xml_graficas(string tcFileXML, out DataTable toTablaDatos, out string tcCampoX, out string tcTitulo, out string tcTituloX, out string tcTituloY, out Dictionary<string, string> toDic)
27  {
28  toTablaDatos = null;
29  toDic = null;
30  tcCampoX = ""; // Campo para la coordenada X
31  tcTitulo = ""; // Titulo_Grafica
32  tcTituloX = ""; // Titulo coordenada X
33  tcTituloY = ""; // Titulo coordenada Y
34 
35  // Comprobando si existe el fichero XML
36  if (File.Exists(tcFileXML) == true)
37  {
38  // Creando xGDocXML
39  XmlDocument xGDocXML = new XmlDocument();
40 
41  //La ruta del documento XML permite rutas relativas
42  xGDocXML.Load(tcFileXML);
43 
44  // Obtenemos el Nodo XML
45  XmlNodeList oNodoTagXML = xGDocXML.GetElementsByTagName("XML");
46 
47  // Obtener el titulo de la grafica
48  XmlElement loNodoChild = (XmlElement)oNodoTagXML[0];
49 
50  if (loNodoChild["Titulo_Grafica"] != null)
51  {
52  tcTitulo = loNodoChild["Titulo_Grafica"].InnerText.ToString();
53  }
54 
55  // Obtener el titulo de la coordenada X
56  if (loNodoChild["TituloX"] != null)
57  {
58  tcTituloX = loNodoChild["TituloX"].InnerText;
59  }
60 
61  // Obtener el titulo de la coordenada Y
62  if (loNodoChild["TituloY"] != null)
63  {
64  tcTituloY = loNodoChild["TituloY"].InnerText;
65  }
66 
67  // Obtenemos el Nodo Datos
68  XmlNodeList oNodoTagDatos = ((XmlElement)oNodoTagXML[0]).GetElementsByTagName("Tabla");
69 
70  // Creando el datatable desde el fichero XML
71  crear_TablaDatos_from_XML(oNodoTagDatos, out toTablaDatos, out tcCampoX, out toDic);
72 
73  }
74 
75  }
76 
84  public void crear_TablaDatos_from_XML(XmlNodeList loNodoTabla, out DataTable loTabla, out string tcCampoX, out Dictionary<string, string> loDic)
85  {
86  tcCampoX = "";
87 
88  int lnCampos = 0;
89  string lcNombreCampo = "";
90  string lcTipoCampo= "" ;
91  string lcTituloCampo = "";
92 
93  loDic = new Dictionary<string, string>();
94 
95  // Creando el objeto dataTable
96  loTabla = new DataTable();
97 
98  // Creando el objeto para insertar los datos en el datatable
99  DataRow loNewRow;
100 
101  // Leyendo el Bloque de Tablas
102  XmlNodeList loNodoCampos = ((XmlElement)loNodoTabla[0]).GetElementsByTagName("ListaCampos");
103 
104  // Bloque de "campos"
105  XmlNodeList loCampos = ((XmlElement)loNodoCampos[0]).GetElementsByTagName("Campos");
106 
107  // Creando el DataTable con los campos que estan definidos en el Nodo ListaCampos
108  foreach (XmlElement loNodoChild in loCampos)
109  {
110  lcNombreCampo = "";
111  lcTipoCampo = "";
112  lcTituloCampo = "";
113 
114  lcNombreCampo = loNodoChild["Nombre"].InnerText;
115  lcTipoCampo = loNodoChild["TipoCampo"].InnerText;
116 
117  if (loNodoChild["Titulo"] != null && (string.IsNullOrEmpty(loNodoChild["Titulo"].InnerText) == false))
118  {
119  lcTituloCampo = loNodoChild["Titulo"].InnerText;
120  }
121 
122  // Agregamos el elemento al diccionario
123  loDic.Add(lcNombreCampo, lcTituloCampo);
124 
125  if ((string.IsNullOrEmpty(lcNombreCampo) == false) && (string.IsNullOrEmpty(lcTipoCampo) == false))
126  {
127  lnCampos++;
128 
129  switch (lcTipoCampo)
130  {
131  // Tipos Enteros en Fox, Int32 en C#
132  case "I":
133  loTabla.Columns.Add(lcNombreCampo, typeof(Int32));
134  break;
135 
136  // Tipos Numericos en Fox, Decimal en C# (para las graficas)
137  case "N":
138  case "B":
139  loTabla.Columns.Add(lcNombreCampo, typeof(Decimal));
140  break;
141 
142  // Tipos Float en Fox, Double en C# (para las graficas)
143  case "F":
144  loTabla.Columns.Add(lcNombreCampo, typeof(double));
145  break;
146 
147  // Tipo logico en Fox, Boleano en C#
148  case "L":
149  loTabla.Columns.Add(lcNombreCampo, typeof(bool));
150  break;
151 
152  // Tipo Fecha en Fox, datetime en C#
153  case "T":
154  case "D":
155  loTabla.Columns.Add(lcNombreCampo, typeof(DateTime));
156  break;
157 
158  // Tipos Numericos en Fox, String en C#
159  case "C":
160  loTabla.Columns.Add(lcNombreCampo, typeof(string));
161 
162  if (lnCampos == 1)
163  {
164  tcCampoX = lcNombreCampo;
165  }
166  break;
167 
168  default:
169  loTabla.Columns.Add(lcNombreCampo);
170 
171  if (lnCampos == 1)
172  {
173  tcCampoX = lcNombreCampo;
174  }
175  break;
176 
177  }
178 
179  }
180 
181  }
182 
183  if (lnCampos > 0)
184  {
185  // Recorremos los datos, para pasarlos al datatable
186  XmlNodeList loNodoDatos = ((XmlElement)loNodoTabla[0]).GetElementsByTagName("Datos");
187 
188  XmlNodeList loNodoRegistro = ((XmlElement)loNodoDatos[0]).GetElementsByTagName("Registro");
189 
190  foreach (XmlElement loNodoChild in loNodoRegistro)
191  {
192  loNewRow = loTabla.NewRow();
193 
194  // asignando los valores en los campos respectivos
195  for (int lnI = 0; lnI < lnCampos; lnI++)
196  {
197  lcNombreCampo = "";
198  lcTipoCampo = "";
199 
200  // Obtener el nombre del campo segun el "tag" del XML
201  lcNombreCampo = loNodoChild.ChildNodes.Item(lnI).Name;
202 
203  // Obtener el tipo de datos según el datatable
204  Type loTipoColumna = loTabla.Columns[lcNombreCampo].DataType;
205  lcTipoCampo = loTipoColumna.Name.ToString();
206 
207  // agregar al registro el valor leeido del XML, según el tipo de datos
208  switch (lcTipoCampo)
209  {
210  case "Int32":
211  loNewRow[lcNombreCampo] = Convert.ToInt32(Text2Val(loNodoChild[lcNombreCampo].InnerText));
212  break;
213 
214  case "Decimal":
215  loNewRow[lcNombreCampo] = Convert.ToDecimal(Text2Val(loNodoChild[lcNombreCampo].InnerText));
216  break;
217 
218  case "Double":
219  loNewRow[lcNombreCampo] = Convert.ToDouble(Text2Val(loNodoChild[lcNombreCampo].InnerText));
220  break;
221 
222  case "Bool":
223  loNewRow[lcNombreCampo] = Convert.ToBoolean(loNodoChild[lcNombreCampo].InnerText);
224  break;
225 
226  case "DateTime":
227  loNewRow[lcNombreCampo] = Convert.ToDateTime(loNodoChild[lcNombreCampo].InnerText);
228  break;
229 
230  case "String":
231  loNewRow[lcNombreCampo] = loNodoChild[lcNombreCampo].InnerText;
232 
233  // Si aún no sabemos el nombre del campo para la coordenada X, asumimos que es el primer campo de tipo "string"
234  if ((string.IsNullOrEmpty(tcCampoX) == true) && (lnI == 0))
235  {
236  tcCampoX = loNodoChild[lcNombreCampo].InnerText;
237  }
238  break;
239 
240  default:
241  loNewRow[lcNombreCampo] = loNodoChild[lcNombreCampo].InnerText;
242 
243  // Si aún no sabemos el nombre del campo para la coordenada X, asumimos que es el primer campo de tipo "string" (por lo menos eso deberia regresar)
244  if ((string.IsNullOrEmpty(tcCampoX) == true) && (lnI == 0))
245  {
246  tcCampoX = loNodoChild[lcNombreCampo].InnerText;
247  }
248  break;
249  }
250 
251  }
252 
253  // añadimos el registro
254  loTabla.Rows.Add(loNewRow);
255  }
256  }
257 
258 
259  }
260 
266  String Text2Val(String tcCadena)
267  {
268  return tcCadena.Replace(",", "_").Replace(".", ",").Replace("_", ".");
269  }
270 
271 
279  public void crear_Lista_from_XML(List<string> toLista, string tcFileXML, string tcNodo, string tcNameTag)
280  {
281  string lcValorTag = "";
282 
283  // Comprobando si existe el fichero XML
284  if (File.Exists(tcFileXML) == true)
285  {
286  // Creando xGDocXML
287  XmlDocument xGDocXML = new XmlDocument();
288 
289  // Obtenemos el Nodo XML
290  XmlNodeList oNodoTagXML = xGDocXML.GetElementsByTagName(tcNodo);
291 
292  foreach (XmlElement loNodoChild in oNodoTagXML)
293  {
294  lcValorTag = loNodoChild[tcNameTag].InnerText;
295  toLista.Add(lcValorTag);
296  }
297 
298 
299  }
300 
301  }
302 
303 
304  }
305 
306 }
void Leer_xml_graficas(string tcFileXML, out DataTable toTablaDatos, out string tcCampoX, out string tcTitulo, out string tcTituloX, out string tcTituloY, out Dictionary< string, string > toDic)
Leer xml de gráficas
void crear_TablaDatos_from_XML(XmlNodeList loNodoTabla, out DataTable loTabla, out string tcCampoX, out Dictionary< string, string > loDic)
Crear tabla de datos a partir del XML
void crear_Lista_from_XML(List< string > toLista, string tcFileXML, string tcNodo, string tcNameTag)
Crear lista a partir del XML