elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [C#] ¿Como leer XML con un DataSet?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C#] ¿Como leer XML con un DataSet?  (Leído 7,008 veces)
Siuto
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.587


Que puedo decir??


Ver Perfil WWW
[C#] ¿Como leer XML con un DataSet?
« en: 14 Agosto 2010, 06:16 am »

Estoy tratando de leer un archivo XML con un DataSet y hasta una parte llegue a ver si alguien me dice el poquito que me falta...

Código
  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  
  3. <root>
  4.  
  5.  <persona>
  6.    <id>1</id>
  7.    <nombre>Juan</nombre>
  8.    <apellido>Perez</apellido>
  9.    <hijos>
  10.      <hijo>Juan II</hijo>
  11.      <hijo>Juan III</hijo>
  12.    </hijos>
  13.  </persona>
  14.  
  15.  <persona>
  16.    <id>2</id>
  17.    <nombre>Carlos</nombre>
  18.    <apellido>Gomez</apellido>
  19.    <hijos>
  20.      <hijo>Carlos II</hijo>
  21.      <hijo>Carlos III</hijo>
  22.    </hijos>
  23.  </persona>
  24.  
  25. </root>


Código
  1. using System;
  2. using System.Data;
  3.  
  4. namespace ConsoleApplication1
  5. {
  6.    class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.            DataSet ds = new DataSet("root");
  11.            ds.ReadXml("../../XMLFile1.xml");
  12.  
  13.            foreach (DataRow dr in ds.Tables["persona"].Rows)
  14.            {
  15.                Console.WriteLine("id: " + dr.Field<String>("id"));
  16.                Console.WriteLine("nombre: " + dr.Field<String>("nombre"));
  17.                Console.WriteLine("apellido: " + dr.Field<String>("apellido"));                
  18.                Console.WriteLine();
  19.            }
  20.  
  21.            Console.ReadLine();
  22.        }
  23.    }
  24. }


Este codigo anda perfecto, lo que no se es como hacer para leer la lista de hijos de cada persona (no necesariamente son dos hijos por persona).


« Última modificación: 14 Agosto 2010, 06:19 am por Siuto » En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: [C#] ¿Como leer XML con un DataSet?
« Respuesta #1 en: 14 Agosto 2010, 15:54 pm »

Hola,

Pues, al igual que DataSet toma los Child Nodes del nodo Persona como Rows, (  foreach (DataRow dr in ds.Tables["persona"].Rows)) puedes hacer lo mismo dentro de ese, pero desde el dataset sacas la tabla Hijos. Si revisas el DataSet, lo más seguro es que tengas 3 tablas, persona, hijos, e hijo.

Persona, es la lista de personas.

Hijo es la lista de Hijos,

Hijos es un registro conector, es decir, una tabla intermedia de una relación Muchos-Muchos, en dónde estará el Id de Persona Y el Id de hijo.

Por ejemplo,si en HIJOS hay un registro asi: 2,5 significa que en la tablas HIJO el ID 5 pertenece a la persona ID 2

Todo eso lo crea automático el DataSet, y puedes hacer selects de eso algo así:

Código
  1. ds.Tables["hijo"].Select("hijos_Id = 1")

Saludos!





En línea

Siuto
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.587


Que puedo decir??


Ver Perfil WWW
Re: [C#] ¿Como leer XML con un DataSet?
« Respuesta #2 en: 17 Agosto 2010, 17:24 pm »

Gracias por la respuesta me acerco un poco mas, pero lo resolví de otra formar. Dejo como lo hice por si alguien le sirve...

De todas formas si hay una forma mas óptima y alguien quiere postearla es bienvenida.

Código
  1. using System;
  2. using System.Data;
  3. using System.Linq;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.    class Program
  8.    {
  9.        static void Main(string[] args)
  10.        {
  11.            DataSet ds = new DataSet("root");
  12.            ds.ReadXml("../../XMLFile1.xml");
  13.  
  14.  
  15.            foreach (DataRow drp in ds.Tables["persona"].Rows)
  16.            {
  17.                // Esta columna de la tabla la genera el DataSet no el archivo XML
  18.                Int32 persona_Id = drp.Field<Int32>("persona_Id");
  19.  
  20.                Console.WriteLine("persona_Id: " + persona_Id);
  21.                Console.WriteLine("id: " + drp.Field<String>("id"));
  22.                Console.WriteLine("nombre: " + drp.Field<String>("nombre"));
  23.                Console.WriteLine("apellido: " + drp.Field<String>("apellido"));
  24.  
  25.  
  26.                var query = from p in ds.Tables["persona"].AsEnumerable()
  27.                            join hs in ds.Tables["hijos"].AsEnumerable() on p.Field<Int32>("persona_Id") equals hs.Field<Int32>("persona_Id")
  28.                            join h in ds.Tables["hijo"].AsEnumerable() on hs.Field<Int32>("hijos_Id") equals h.Field<Int32>("hijos_Id")
  29.                            where p.Field<Int32>("persona_Id") == persona_Id
  30.                            select h;
  31.  
  32.                foreach (DataRow drh in query)
  33.                {
  34.                    Console.WriteLine("Hijo: " + drh.Field<String>("hijo_Text"));
  35.                }
  36.  
  37.                Console.WriteLine();
  38.            }
  39.  
  40.            Console.ReadLine();
  41.        }
  42.    }
  43. }
« Última modificación: 17 Agosto 2010, 17:27 pm por Siuto » En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: [C#] ¿Como leer XML con un DataSet?
« Respuesta #3 en: 17 Agosto 2010, 18:15 pm »

Que bien!

Bueno te digo, es prácticamente lo mismo que te dije, pero usando LINQ. Como optimización (más bien reducción de código, puedes mejorar esa consulta de modo tal de que elimines el primer foreach. Pero así está muy bien y bien claro.

Te hice este demo para que veas la continuación de lo que yo creo debería ser tu Query:
Código
  1. static void Main(string[] args)
  2. {
  3.    DataSet ds = new DataSet("root");
  4.    ds.ReadXml("../../XMLFile1.xml");
  5.  
  6.    var resultNested = from persona in ds.Tables["persona"].AsEnumerable()
  7.                        select new
  8.                        {
  9.                            Nombre = persona.Field<string>("nombre"),
  10.                            Apellido = persona.Field<string>("apellido"),
  11.                            ID = persona.Field<Int32>("persona_Id"),
  12.                            Hijos = from hijos in ds.Tables["hijos"].AsEnumerable()
  13.                                    join hijo in ds.Tables["hijo"].AsEnumerable() on hijos.Field<Int32>("hijos_Id") equals hijo.Field<Int32>("hijos_Id")
  14.                                    where hijos.Field<Int32>("persona_Id") == persona.Field<Int32>("persona_Id")
  15.                                    select new { Nombre = hijo.Field<string>("hijo_Text") }
  16.                        };
  17.  
  18.    foreach (var p in resultNested)
  19.    {
  20.        Console.WriteLine(p.Nombre+" "+ p.Apellido);
  21.        foreach (var h in p.Hijos)
  22.        {
  23.            Console.WriteLine(" -"+h.Nombre);
  24.        }
  25.    }
  26.  
  27.    Console.ReadLine();
  28. }
  29.  

Como puedes ver, creo typos anónimos on-the-fly, y con una propiadad que es una colección como resultado de otro query. LINQ es poderoso, más que todo en reducción de código, y hace que se vea mucho más simple, aunque en temas de rendimiento, es prácticamente igual.

Un saludo!

EDIT: Se me olvidó decirte xD, de esta forma también estás separando el controller del view, por así decirlo.!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines