none
Ayuda XML empty RRS feed

  • Pregunta

  • Hola a todos, necesito una pequeña ayuda en un XML que no consigo obviar los valores Empty mas abajo explico un poco la idea

                XmlDocument xmldoc = new XmlDocument();
                XmlNodeList xmlnode;
                int i = 0;
                xmldoc.Load("http://tray.technobase.fm/radio.xml");
                xmlnode = xmldoc.GetElementsByTagName("weareone");
                for (i = 0; i <= xmlnode.Count - 1; i++)
                {
                    foreach (XmlElement nodo in xmlnode)
                    {
                        int o = 0;
                        XmlNodeList NombreRadio = nodo.GetElementsByTagName("name");
                        XmlNodeList Cancion = nodo.GetElementsByTagName("song");
                        XmlNodeList Artista = nodo.GetElementsByTagName("artist");
                        XmlNodeList Oyentes = nodo.GetElementsByTagName("listener");
                        XmlNodeList Genero = nodo.GetElementsByTagName("style");
                        XmlNodeList DJ = nodo.GetElementsByTagName("moderator");
    
                        Console.WriteLine("Escuchas: " + NombreRadio[o].InnerText);
                        Console.WriteLine("Cancion: " + Artista[o].InnerText + " - " + Cancion[o].InnerText);
                        Console.WriteLine("Oyentes: " + Oyentes[o].InnerText);
    
                        Console.WriteLine("DJ: " + DJ[o].InnerText);
    
                        Console.WriteLine("Estilo: " + Genero[o].InnerText);
    

    Hasta ahí todo bien cuando el XML funciona en todas sus etiquetas, pero cuando el DJ deja de transmitir, la etiqueta style y moderator y alguna otra mas dejan de existir y se ponen asi en el XML

    <moderator/>

    <style/>

    Entonces como puedo hacer para que cuando ese valor no esté diga así:

    Console.WriteLine("No hay DJ en este momento");
    Console.WriteLine("Estilo: Techno");

    Y cuando en el XML esté funcionando:

    <moderator>DJ EJEMPLO</moderator>

    En el programa salga así:

    Console.WriteLine("DJ EJEMPLO");

    He probado de varias formas pero siempre me tira error.. seguramente sea una tontería y no veo el fallo, pero estoy bastante atascado en esto.

    Un cordial saludo y gracias de antemano.

    miércoles, 22 de noviembre de 2017 23:18

Respuestas

  • Agrega una variable auxiliar (texto3), para mantener el artista o la canción hasta componer el texto definitivo

    using System;
    using System.Linq;
    using System.Xml;
    
    namespace ConsoleApplication111
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument xmldoc = new XmlDocument();
                XmlNodeList xmlnode;
    
                xmldoc.Load("http://tray.technobase.fm/radio.xml");
                xmlnode = xmldoc.GetElementsByTagName("radio");
                foreach (XmlElement nodo in xmlnode.Cast<XmlElement>().Take(5))
                {
                    string texto3 = string.Empty;
                    foreach (XmlNode item in nodo)
                    {
                        string texto1 = string.Empty;
                        string texto2 = string.Empty;
                        switch (item.Name)
                        {
                            case "name":
                                texto1 = "Escuchas: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "song":
                                if (texto3.Length == 0)
                                {
                                    texto3 = item.InnerText;
                                }
                                else
                                {
                                    texto1 = "Canción: ";
                                    texto2 =  item.InnerText + " - " + texto3;
                                }
                                break;
    
                            case "artist":
                                if (texto3.Length == 0)
                                {
                                    texto3 = item.InnerText;
                                }
                                else
                                {
                                    texto1 = "Canción: ";
                                    texto2 = texto3 + " - " + item.InnerText;
                                }
                                break;
    
                            case "listener":
                                texto1 = "Oyentes: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "style":
                                texto1 = "Estilo: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "moderator":
                                texto1 = "DJ: ";
                                texto2 = item.InnerText.Length > 0 ? item.InnerText : "No hay DJ en este momento";
                                break;
                        }
                        if (texto1.Length > 0)
                            Console.WriteLine("{0}{1}", texto1, texto2);
                    }
    
                    Console.WriteLine();
                }
                Console.ReadKey();
            }
        }
    }


    Ok, asume que no hay song sin artist.

    • Editado walter_5 jueves, 23 de noviembre de 2017 16:03
    • Marcado como respuesta D.M.X jueves, 23 de noviembre de 2017 18:12
    • Desmarcado como respuesta D.M.X jueves, 23 de noviembre de 2017 18:12
    • Marcado como respuesta D.M.X jueves, 23 de noviembre de 2017 18:12
    jueves, 23 de noviembre de 2017 16:01
  • using System;
    using System.Xml;
    
    namespace ConsoleApplication111
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument xmldoc = new XmlDocument();
                XmlNodeList xmlnode;
    
                xmldoc.Load("http://tray.technobase.fm/radio.xml");
                xmlnode = xmldoc.GetElementsByTagName("radio");
                foreach (XmlElement nodo in xmlnode)
                {
                    foreach (XmlNode item in nodo)
                    {
                        string texto1 = string.Empty;
                        string texto2 = string.Empty;
                        switch (item.Name )
                        {
                            case "name":
                                texto1 = "Escuchas: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "song":
                                texto1 = "Canción: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "artist":
                                texto1 = "Artista: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "listener":
                                texto1 = "Oyentes: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "style":
                                texto1 = "Estilo: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "moderator":
                                texto1 = "DJ: ";
                                texto2 = item.InnerText.Length > 0 ? item.InnerText : "No hay DJ en este momento";
                                break;
                        }
                        if (texto1.Length > 0)
                            Console.WriteLine("{0}{1}", texto1, texto2);
                    }
    
                    Console.WriteLine();
                }
                Console.ReadKey();
            }
        }
    }
    

    • Marcado como respuesta D.M.X jueves, 23 de noviembre de 2017 3:01
    jueves, 23 de noviembre de 2017 0:20

Todas las respuestas

  • using System;
    using System.Xml;
    
    namespace ConsoleApplication111
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument xmldoc = new XmlDocument();
                XmlNodeList xmlnode;
    
                xmldoc.Load("http://tray.technobase.fm/radio.xml");
                xmlnode = xmldoc.GetElementsByTagName("radio");
                foreach (XmlElement nodo in xmlnode)
                {
                    foreach (XmlNode item in nodo)
                    {
                        string texto1 = string.Empty;
                        string texto2 = string.Empty;
                        switch (item.Name )
                        {
                            case "name":
                                texto1 = "Escuchas: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "song":
                                texto1 = "Canción: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "artist":
                                texto1 = "Artista: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "listener":
                                texto1 = "Oyentes: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "style":
                                texto1 = "Estilo: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "moderator":
                                texto1 = "DJ: ";
                                texto2 = item.InnerText.Length > 0 ? item.InnerText : "No hay DJ en este momento";
                                break;
                        }
                        if (texto1.Length > 0)
                            Console.WriteLine("{0}{1}", texto1, texto2);
                    }
    
                    Console.WriteLine();
                }
                Console.ReadKey();
            }
        }
    }
    

    • Marcado como respuesta D.M.X jueves, 23 de noviembre de 2017 3:01
    jueves, 23 de noviembre de 2017 0:20
  • Muchisimas gracias, funciona! pero me salen todas las radios del XML... con el anterior codigo me salia nada mas que la primera radio..

    Un saludo!

    jueves, 23 de noviembre de 2017 1:19
  • Si quieres una, escribe nodo.Take(1) en el foreach... O si quieres por nombre ponle Where name tanto, o lo que quieras.

    ----

    perdón, xmlnode.Take(1).  Foreach equivocado...

    • Editado walter_5 jueves, 23 de noviembre de 2017 1:28
    jueves, 23 de noviembre de 2017 1:22
  • No existe Take ni hay referencia..
    jueves, 23 de noviembre de 2017 1:29
  • 'System.Xml.XmlNodeList' no contiene una definición de 'Take' ni se encontró ningún método de extensión 'Take' que acepte un primer argumento de tipo 'System.Xml.XmlNodeList' (¿falta una directiva using o una referencia de ensamblado?)
    jueves, 23 de noviembre de 2017 1:34
  • Mi culpa.

    foreach (XmlElement nodo in xmlnode.Cast<XmlElement>().Take(1))

    el espacio de nombres es System.Linq

    • Propuesto como respuesta Willams Morales jueves, 23 de noviembre de 2017 3:00
    jueves, 23 de noviembre de 2017 1:46
  • Cierto, el error tambien era que estaba en System.Xml.Linq, todo solucionado! muchas gracias amigo walter!
    jueves, 23 de noviembre de 2017 1:48
  • hola

    si tienes un xml porque no lo deserializas a una clase? es mil veces mas practico que parsealo como lo realizas

     Convert XML to C# Classes

    puedes convertir la estructira del xml a clase y luego deserializar

     

    Object Serialization using C#

    como veras es directo, pasas los datos a la estructura de la clase

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 23 de noviembre de 2017 12:26
  • Hola Sr Tuttini, mi Visual Studio no trae esa opcion de pegar el xml...

    Tengo una duda con el código que proporcionó nuestro compañero Walter, como puedo poner 

                            case "song":
                                texto1 = "Canción: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "artist":
                                texto1 = "Artista: ";
                                texto2 = item.InnerText;
                                break;

    esas dos juntas en el WriteLine? es decir que salgan así:

    Console.WriteLine("Cancion: " + song + artist);

    Un cordial saludo!

    jueves, 23 de noviembre de 2017 14:42
  • hola

    >>mi Visual Studio no trae esa opcion de pegar el xml

    que version de VS estas utilizando ?

    recuerda que tienes que copiar un xml para que se habilite el pegado especial

    sino usas

    http://xmltocsharp.azurewebsites.net/

    para obtener las clases en base al xml y asi poder deserializar

    >>como puedo poner .. esas dos juntas en el WriteLine?

    en el switch puede poner dos case iguales usando

    switch(xx){
    
        case "song":
        case "artist":
    
            //codigo
    
            break;
    
    }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 23 de noviembre de 2017 14:53
  • Gracias por su respueta, 

    El link que me pasaste no le conocía, 

    >>que version de VS estas utilizando ?

    Utilizo Visual Studio Express 2012.

    El código:

                                case "song":
                                case "artist":
    
                                    texto1 = "Canción: ";
                                    texto2 = item.InnerText;
    
                                    break;

    Funciona pero sale así:

    Canción: xx Song
    Canción: xx Artist

    Y quiero que salga en una misma tirada así:

    Canción: Artist - Song

    Un cordial saludo!

    jueves, 23 de noviembre de 2017 15:31
  • Agrega una variable auxiliar (texto3), para mantener el artista o la canción hasta componer el texto definitivo

    using System;
    using System.Linq;
    using System.Xml;
    
    namespace ConsoleApplication111
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument xmldoc = new XmlDocument();
                XmlNodeList xmlnode;
    
                xmldoc.Load("http://tray.technobase.fm/radio.xml");
                xmlnode = xmldoc.GetElementsByTagName("radio");
                foreach (XmlElement nodo in xmlnode.Cast<XmlElement>().Take(5))
                {
                    string texto3 = string.Empty;
                    foreach (XmlNode item in nodo)
                    {
                        string texto1 = string.Empty;
                        string texto2 = string.Empty;
                        switch (item.Name)
                        {
                            case "name":
                                texto1 = "Escuchas: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "song":
                                if (texto3.Length == 0)
                                {
                                    texto3 = item.InnerText;
                                }
                                else
                                {
                                    texto1 = "Canción: ";
                                    texto2 =  item.InnerText + " - " + texto3;
                                }
                                break;
    
                            case "artist":
                                if (texto3.Length == 0)
                                {
                                    texto3 = item.InnerText;
                                }
                                else
                                {
                                    texto1 = "Canción: ";
                                    texto2 = texto3 + " - " + item.InnerText;
                                }
                                break;
    
                            case "listener":
                                texto1 = "Oyentes: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "style":
                                texto1 = "Estilo: ";
                                texto2 = item.InnerText;
                                break;
    
                            case "moderator":
                                texto1 = "DJ: ";
                                texto2 = item.InnerText.Length > 0 ? item.InnerText : "No hay DJ en este momento";
                                break;
                        }
                        if (texto1.Length > 0)
                            Console.WriteLine("{0}{1}", texto1, texto2);
                    }
    
                    Console.WriteLine();
                }
                Console.ReadKey();
            }
        }
    }


    Ok, asume que no hay song sin artist.

    • Editado walter_5 jueves, 23 de noviembre de 2017 16:03
    • Marcado como respuesta D.M.X jueves, 23 de noviembre de 2017 18:12
    • Desmarcado como respuesta D.M.X jueves, 23 de noviembre de 2017 18:12
    • Marcado como respuesta D.M.X jueves, 23 de noviembre de 2017 18:12
    jueves, 23 de noviembre de 2017 16:01