Ajuda Para Ler XML com C#

Tenho o seguinte XML:

[code]<?xml version="1.0" encoding="iso-8859-1"?>

<tb_parceiro desc=“Parceiro de negócios”>

  <coluna desc="Código do PN">CardCode</coluna>
  <coluna desc="Nome do PN">CardName</coluna>

</tb_parceiro>

<tb_teste>
Teste
</tb_teste>

[/code]

  • Dentro da tag tabelas ficara todas as minhas tabelas que irei mapear manualmente.
  • Dentro de tabelas irá existir uma tag com o nome da tabela e sua descrição. EX: <tb_parceiro desc=“Parceiro de negócios”>
  • Dentro de da tb_parceiro irá existir várias tags com o nome com uma descrição e seu valor.

Como percorro esse xml pegando todas as colunas de um determinada tabela, sua descrição e seu valor? E pegar a descrição de uma determinada tabela també?
Tem que ser usando C#.

Ola,

voce pode usar LINQ to XML, por exemplo.

Primeiro eu acho que voce deveria mudar a estrutura do seu XML para ficar mais facil de fazer queries, por exemplo:

<?xml version="1.0" encoding="iso-8859-1"?>
<tabelas>
  <tabela name="tb_parceiro" desc="Parceiro de negócios">

    <coluna desc="Código do PN">CardCode</coluna>
    <coluna desc="Nome do PN">CardName</coluna>

  </tabela>

  <tabela name="tb_teste">
    <coluna desc="teste">Teste</coluna>
  </tabela>
  
</tabelas>

Repare que eu troquei o elementos que vc criou com o nome da tabela e os chamei de “tabela” e adicionei um atributo “name” com o nome da tabela.

E o codigo para percorrer os dados no XML:

XDocument xml = XDocument.Load(c:\\tabelas.xml");

// obtem os nomes das tabelas.
var tabelas = from item in xml.Element("tabelas").Elements("tabela")
                           select item.FirstAttribute.Value;

 foreach (var tab in tabelas)
 {
   // Faz um loop e obtem as colunas para cada tabela.
   Console.WriteLine(String.Format("Tabela -> {0}", tab));

   XElement elem = xml.Element("tabelas");
   var colunas = elem.Elements("tabela")
                            .Where( c=> c.FirstAttribute.Value.Equals(tab))
                            .Descendants();

   foreach(var c in colunas) 
   {
        Console.WriteLine(String.Format("    Coluna: {0}", c.Value));
    
         // para pegar a descricao da coluna eh soh fazer:
         // c.Attribute("desc");
   }
}

O resultado no terminal vai ser assim:

Tabela -> tb_parceiro
    Coluna: CardCode
    Coluna: CardName
Tabela -> tb_teste
    Coluna: Teste

//Daniel

Me emploguei para brincar com o LINQ na hora do almoco, ai vai o codigo completo com algumas modificacoes nas queries. :slight_smile:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                XDocument doc = XDocument.Load("c:\\tabelas.xml");

                var tabelas = GetTableNames(doc);
                tabelas.SelectMany(t => new Dictionary<String, IList<XElement>> { {t, GetColumns(doc, t) } })
                    .ToList()
                    .ForEach(val => PrintTabInfo(val.Key, val.Value));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            Console.ReadKey();
           
        }

        public static void PrintTabInfo(String tableName , IList<XElement> columns)
        {
            Console.WriteLine("Table : " + tableName);
            foreach (var item in columns)
            {
                Console.WriteLine("Column : " + item.Value);
            }
        }

        public static IList<String> GetTableNames(XDocument doc) 
        {
            var tabelas = from item in doc.Element("tabelas").Elements("tabela")
                select item.FirstAttribute.Value;
            return tabelas.ToList();
        }

        public static IList<XElement> GetColumns(XDocument doc, string tableName)
        {
            XElement elem = doc.Element("tabelas");
            var colunas = elem.Elements("tabela").Where(c => c.FirstAttribute.Value.Equals(tableName))
                .Descendants();
            return colunas.ToList();
        }
    }
}

Espero ter ajudado. :slight_smile:

//Daniel

[quote=windsofhell]Me emploguei para brincar com o LINQ na hora do almoco, ai vai o codigo completo com algumas modificacoes nas queries. :slight_smile:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                XDocument doc = XDocument.Load("c:\\tabelas.xml");

                var tabelas = GetTableNames(doc);
                tabelas.SelectMany(t => new Dictionary<String, IList<XElement>> { {t, GetColumns(doc, t) } })
                    .ToList()
                    .ForEach(val => PrintTabInfo(val.Key, val.Value));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            Console.ReadKey();
           
        }

        public static void PrintTabInfo(String tableName , IList<XElement> columns)
        {
            Console.WriteLine("Table : " + tableName);
            foreach (var item in columns)
            {
                Console.WriteLine("Column : " + item.Value);
            }
        }

        public static IList<String> GetTableNames(XDocument doc) 
        {
            var tabelas = from item in doc.Element("tabelas").Elements("tabela")
                select item.FirstAttribute.Value;
            return tabelas.ToList();
        }

        public static IList<XElement> GetColumns(XDocument doc, string tableName)
        {
            XElement elem = doc.Element("tabelas");
            var colunas = elem.Elements("tabela").Where(c => c.FirstAttribute.Value.Equals(tableName))
                .Descendants();
            return colunas.ToList();
        }
    }
}

Espero ter ajudado. :slight_smile:

//Daniel[/quote]

LINQ é uma das coisas mais legais que eu vi no C#. Dá pra fazer códigos muito interessantes, como esse que você fez.